JAVA版23種設計模式綜合專案(實戰),設計模式綜合應用的
加入組合模式 n面臨的問題 分析前面直譯器模式的實現,會發現對於客戶端而言,並不想要去區分到底是非終結符物件還是終結符物件,只是想要以一個統一的方式來請求解析。 該怎麼解決這個問題呢? n n用組合模式來解決 n組合模式基礎回顧 初識組合模式 n定義 將物件組合成樹形結構以表示
java的設計模式大體上分為三大類:
- 建立型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。
- 結構型模式(7種):介面卡模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。
- 行為型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。
設計模式遵循的原則有6個:
1、開閉原則(Open Close Principle)
對擴充套件開放,對修改關閉。
2、里氏代換原則(Liskov Substitution Principle)
只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被複用,而衍生類也能夠在基類的基礎上增加新的行為。
3、依賴倒轉原則(Dependence Inversion Principle)
這個是開閉原則的基礎,對介面程式設計,依賴於抽象而不依賴於具體。
4、介面隔離原則(Interface Segregation Principle)
使用多個隔離的藉口來降低耦合度。
5、迪米特法則(最少知道原則)(Demeter Principle)
一個實體應當儘量少的與其他實體之間發生相互作用,使得系統功能模組相對獨立。
6、合成複用原則(Composite Reuse Principle)
原則是儘量使用合成/聚合的方式,而不是使用繼承。繼承實際上破壞了類的封裝性,超類的方法可能會被子類修改。
1. 工廠模式(Factory Method)
常用的工廠模式是靜態工廠,利用static方法,作為一種類似於常見的工具類Utils等輔助效果,一般情況下工廠類不需要例項化。
interface food{} class A implements food{} class B implements food{} class C implements food{}
public class StaticFactory {
private StaticFactory(){} public static food getA(){ return new A(); } public static food getB(){ return new B(); } public static food getC(){ return new C(); } } class Client{ //客戶端程式碼只需要將相應的引數傳入即可得到物件 //使用者不需要了解工廠類內部的邏輯。 public void get(String name){ food x = null ; if ( name.equals("A")) { x = StaticFactory.getA(); }else if ( name.equals("B")){ x = StaticFactory.getB(); }else { x = StaticFactory.getC(); } } }
2. 抽象工廠模式(Abstract Factory)
一個基礎介面定義了功能,每個實現介面的子類就是產品,然後定義一個工廠介面,實現了工廠介面的就是工廠,這時候,介面程式設計的優點就出現了,我們可以新增產品類(只需要實現產品介面),只需要同時新增一個工廠類,客戶端就可以輕鬆呼叫新產品的程式碼。
抽象工廠的靈活性就體現在這裡,無需改動原有的程式碼,畢竟對於客戶端來說,靜態工廠模式在不改動StaticFactory類的程式碼時無法新增產品,如果採用了抽象工廠模式,就可以輕鬆的新增拓展類。
例項程式碼:
interface food{} class A implements food{} class B implements food{} interface produce{ food get();} class FactoryForA implements produce{ @Override public food get() { return new A(); } } class FactoryForB implements produce{ @Override public food get() { return new B(); } } public class AbstractFactory { public void ClientCode(String name){ food x= new FactoryForA().get(); x = new FactoryForB().get(); } }
3. 單例模式(Singleton)
在內部建立一個例項,構造器全部設定為private,所有方法均在該例項上改動,在建立上要注意類的例項化只能執行一次,可以採用許多種方法來實現,如Synchronized關鍵字,或者利用內部類等機制來實現。
public class Singleton { private Singleton(){} private static class SingletonBuild{ private static Singleton value = new Singleton(); } public Singleton getInstance(){ return SingletonBuild.value ;} }
4.建造者模式(Builder)
在瞭解之前,先假設有一個問題,我們需要建立一個學生物件,屬性有name,number,class,sex,age,school等屬性,如果每一個屬性都可以為空,也就是說我們可以只用一個name,也可以用一個school,name,或者一個class,number,或者其他任意的賦值來建立一個學生物件,這時該怎麼構造?
難道我們寫6個1個輸入的建構函式,15個2個輸入的建構函式.......嗎?這個時候就需要用到Builder模式了。給個例子,大家肯定一看就懂: