溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

設(shè)計模式之單一原則

發(fā)布時間:2020-04-05 11:29:13 來源:網(wǎng)絡(luò) 閱讀:420 作者:darrengreater 欄目:開發(fā)技術(shù)

定義

一個類只能負責(zé)一項工作

發(fā)生的問題

A負責(zé)不同的工作:工作W1,工作W2.當(dāng)由于工作W1需要發(fā)生修改而需要修改類A時,有可能會導(dǎo)致原本進行正常的工作W2可能發(fā)生故障。

解決方法

   實行單一工作原則,分別建立兩個類A1A2。這樣讓A1負責(zé)W1的功能,A2負責(zé)W2的功能。這樣,修改A1就不會修改W2的功能了,同理 修改A2就不會修改W1的功能。

   

   說到單一工作原則,很多人不屑一顧,因為它原理太簡單了。稍有經(jīng)驗的程序員沒有學(xué)習(xí)過設(shè)計模式,沒有聽說單一工作原則,但是在實際開發(fā)過程中自覺就實行運用這一原則了,因為這是常識,因為在開發(fā)過程,誰都不希望因為修改一個類而導(dǎo)致其他功能發(fā)生故障。而避免這一現(xiàn)象的發(fā)生,采用單一工作原則是不錯的選擇。

    

設(shè)計模式之單一原則


運行結(jié)果:

    老人會說話?。?/span>

兒童會說話??!

青年會說話!!

 

 

程序運行后,發(fā)現(xiàn)問題了,并不是所有的生命都會說話,比如動物就不會說話,啞巴也不會說話。如果再細分的話,可以將living類分為normalpeople,animaldumb

package text2;
 
public class design {
  public static void main(String[] args) {
living normal=new living();
normal.speak("兒童");
normal.speak("老人");
normal.speak("青年");
dump d=new dump();
d.speak("啞巴");
Animal a=new Animal();
    a.speak("小鳥");
  }   
}
class living{
public void speak(String who)
{
       System.out.println(who+"會說話?。?);
}
}
class dump{
public void speak(String who)
{
System.out.println(who+"是不會說話的!");
}
}
class Animal{
public void speak(String who)
{
System.out.println(who+"不會說話的!");
}
}


運行結(jié)果

兒童會說話?。?/span>

老人會說話??!

青年會說話??!

啞巴是不會說話的!

小鳥不會說話的!

 

 

我們看到修改后的花銷是大的,除了living類修改了,而且還增加了類,我們直接可以修改living,雖然違背了單一工作的原則,但是花銷變小了.

 代碼如下:

package text3;
 
public class design {
    public static void main(String[] args) {
    living l=new living();
    l.speak("老人");
    l.speak("兒童");
    l.speak("青年");
    l.speak("啞巴");
    l.speak("小鳥");
    }
 
}
class  living{
public void speak(String who)
{
if("老人".equals(who) || "兒童".equals(who) || "青年".equals(who)){
System.out.println(who+"會說話!!");
}else if("啞巴".equals(who)){
System.out.println(who+"不會說話!");
}else if("小鳥".equals(who)){
System.out.println(who+"不會說話!");
}
}
}


運行結(jié)果

老人會說話!!

兒童會說話!!

青年會說話!!

啞巴不會說話!

小鳥不會說話!

 

 

 

可以看到,這種修改方式要簡單的多,但是存在隱患時:有一天需要將小鳥分類 麻雀 和 鷹 .則需要修改living類中speak方法啊.則對原有代碼修改會對調(diào)用 老人,青年,兒童等相關(guān)功能帶來風(fēng)險.也許有一天代碼量增多,運行結(jié)果 正常人中的老人不會說話了!! 這種修改時簡單,但是違背了單一工作原則,到后來的隱患是大的.

package
 text4;


 

public class design {
    public static void main(String[] args) {
    Living l=new Living();
    l.speak("老人");
    l.speak("兒童");
    l.speak("青年");
    l.noSpeak("啞巴");
    l.noSpeak("小鳥");
    
}
}
class Living{
public void speak(String who)
{
System.out.println(who+"是會說話的");
}
public void noSpeak(String who)
{
System.out.println(who+"不會說話的");
}
}


 

運行結(jié)果

老人是會說話的

兒童是會說話的

青年是會說話的

啞巴不會說話的

小鳥不會說話的

 

 

 

可以看到,這種修改沒有改動原來類中的方法,而是在類中新增加一個方法,這樣雖然說違背了單一工作方式,但在方法級別上是符合單一工作原則的.因為它沒有修改原來的方法的代碼

這三種方法各有利弊,那么在實際的開發(fā)中,采取哪種方法呢 ?這個要根據(jù)實際的開發(fā)需求,

  只要邏輯簡單,才可以代碼級別上違背單一工作原則,只有類中的方法足夠多,才可以在方法級別上違背單一工作原則

  單一工作原則的優(yōu)點:

 

1 可以降低復(fù)雜度,一個類只負責(zé)一個功能,其邏輯肯定比負責(zé)多個功能簡單的多.

2提高性的可讀性,提高系統(tǒng)的可維護性.

3修改代碼引起的風(fēng)險降低.

 

需要說明的是 單一工作原則不只是面向?qū)ο缶幊讨兴赜械?/span>.只要是模塊化程序設(shè)計,都適用于單一工作原則.

 






向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI