設計模式介紹
設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的代碼設計經驗的總結,它與具體的語言無關,是一種思想,掌握了面向對象的思想,才可以更好的理解設計模式,而反之亦然。 在java中總共有23種設計模式,這些設計模式分別分為如下幾種類型: 創建型模式:針對對象的創建方式 結構型模式:針對對象的組成結構的操作 行為型模式:針對對象的行為的操作設置 其中,創建型模式有6種,分別為簡單工廠模式(Simple Factory)、工廠方法模式(Factory Method)、抽象工廠模式(Abstract Factory)、創建者模式(Builder)、原型模式(Prototype)、單例模式(Singleton) 結構型模式有7種,分別為外觀模式/門面模式(Facade門面模式)、適配器模式(Adapter)、代理模式(Proxy)、裝飾模式(Decorator)、橋樑模式/橋接模式(Bridge)、組合模式(Composite)、享元模式(Flyweight) 行為型模式有10種,分別為模板方法模式(Template Method)、觀察者模式(Observer)、狀態模式(State)、策略模式(Strategy)、職責鏈模式(Chain of Responsibility)、命令模式(Command)、訪問者模式(Visitor)、調停者模式(Mediator)、備忘錄模式(Memento)、迭代器模式(Iterator)、解釋器模式(Interpreter) 以下分別對這三種模式的部分常用模式進行生活案例與程序案例分析: |
創建型模式
1. 單例模式
生活案例:國家施行的計劃生育政策, 規定一對夫婦只生一胎,剛結婚時,確定生一胎,生完後無論如何不能再生,否則違背國家政策。 程序概念:所謂單例設計模式簡單說就是無論程序如何運行,採用單例設計模式的類(Singleton類)永遠只會有一個實例化對象產生。具體實現步驟如下: (1) 構造方法私有化(採用private修飾)。 (2) 使用靜態方法調用得到單例模式對象。 代碼如下所示: class Singleton { private static Singleton instance = new Singleton();// 餓漢式 public static Singleton getInstance() { return instance; } private Singleton() { // 構造方法封裝為私有化 } } public class Test2 { public static void main(String args[]) { Singleton s = Singleton.getInstance(); //兩個對象一致 Singleton s = Singleton.getInstance(); } } |
2. 簡單工廠模式
生活案例:一個賣肉工廠可以生產豬肉、狗肉、羊肉、牛肉等,工廠很清楚有哪些的產品,所以我們只需要工廠提供即可 程序概念:簡單工廠又叫靜態工廠,由一個工廠對象決定創建哪一個產品對象 代碼案例如下: public class Factory{ public static int PIG_TYPE = 1; public static int DOG_TYPE = 2; public static Animal getAnimal(int flag) { if(flag==PIG_TYPE){ return new Pig(); //獲取豬肉對象 }else if(flag==DOG_TYPE){ return new Dog(); //獲取狗肉對象 } return null; } } public class Test2 { public static void main(String args[]) { //獲得狗肉對象 Animal a = Factory.getAnimal(Factory.DOG_TYPE); } } |
結構型模式
1. 代理模式
生活案例:小強喜歡小紅,但自己不敢表白,然後叫老王代理自己表白,並且叫老王每天代理自己給小紅送花、送早餐... 程序概念:代理模式就給某一個對象提供一個代理對象,並由代理對象控制對原對象的引用 代碼案例如下: interface Network { // 定義Network接口 public void browse(); // 定義瀏覽的抽象方法 } class Real implements Network { // 真實的上網操作 public void browse() { // 覆寫抽象方法 System.out.println("上網瀏覽信息!"); } } class Proxy implements Network { // 代理上網 private Network network; public Proxy(Network network) {// 設置代理的真實操作 this.network = network; // 設置代理的子類 } public void check() { // 身份驗證操作 System.out.println("檢查用戶是否合法!"); } public void browse() { this.check(); // 調用具體的代理業務操作 this.network.browse(); // 調用真實的上網操作 } } public class Test2 { public static void main(String args[]) { Network net = new Proxy(new Real()); //傳入代理的真實操作 net.browse(); // 調用代理的上網操作 } } |
2. 適配器模式
生活案例:姚明剛進NBA時,因為不會說英語,聽不懂指揮戰術,這是一個很麻煩的事;那麼,有下面兩個方案可解決問題:1.讓姚明苦練英語,顯然不能達到立竿見影效果;2. 讓NBA的教練學好中文,顯然也不合適;那麼應該怎麼辦呢?很簡單,找一個翻譯進行中英文對接把戰術中的內容進行翻譯即可; 程序概念:如果一個類要實現一個具有很多抽象方法的接口,但是本身只需要實現接口中的部分方法便可以達成目的,所以此時就需要一箇中間的過渡類,但此過渡類又不希望直接使用,所以將此類定義為抽象類最為合適,再讓以後的子類直接繼承該抽象類便可選擇性的重寫所需要的方法,而此抽象類便是適配器類。 代碼案例如下: interface Window {// 定義Window窗口接口,表示窗口操作 public void open();// 窗口打開 public void close();// 窗口關閉 public void iconified();// 窗口最小化 public void deiconified();// 窗口恢復 public void activated();// 窗口活動 } // 定義抽象類實現接口,在此類中覆寫方法,但是所有的方法體為空 abstract class WindowAdapter implements Window {public void open() {};// 窗口打開 public void close() {};// 窗口關閉 public void iconified(){};// 窗口最小化 public void deiconified(){};// 窗口恢復 public void activated(){};// 窗口活動 } // 子類繼承WindowAdapter抽象類,選擇性實現需要的方法 class WindowImpl extends WindowAdapter { public void open() { System.out.println("窗口打開");// 實現open()方法 } public void close() { System.out.println("窗口關閉");// 實現close()方法 } } public class Test2 { public static void main(String args[]) { Window win = new WindowImpl(); // 實現接口對象 win.open(); // 調用方法 win.close(); } } |
行為型模式
1. 觀察者模式
生活案例:小強交了兩個女朋友,每次需要洗衣服了,就通知兩個女朋友來幫他完成洗衣服的任務;下次有需求變更,比如洗襪子任務,那麼通知女朋友後,女朋友們能夠繼續完成這一變更任務 程序概念:觀察者模式(又被稱為發佈-訂閱(Publish/Subscribe)模式,它定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知所有的觀察者對象,使他們能夠自動更新自己 代碼案例如下: class Boy{ private List public void add(Girl girl){ list.add(girl); } public void notifyWash(String msg){ for(Girl girl : list){ girl.wash(msg); //交給女朋友們洗衣服 } } } class Girl{ public void wash(String msg){ System.out.println(msg); } } public class Test2 { public static void main(String args[]) { Boy boy = new Boy(); Girl girl1 = new Girl(); Girl girl2 = new Girl(); boy.add(girl1); //監聽一號女朋友 boy.add(girl2); //監聽二號女朋友 boy.notifyWash("趕緊去洗衣服!"); } } |
2. 策略模式
生活案例:商場搞促銷活動,初級會員打9折,我需要程序員改代碼;然後中級會員8折,又得改一次;高級會員,依然要改;如果每次提出需要程序都更新一次,那麼這個程序的設計肯定有問題;我們可以改變策略,先把初級、中級、高級會員一一封裝起來;用到哪種促銷活動則去計算不同折扣 程序概念:策略模式是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發生變化。策略模式是對算法的包裝,是把使用算法的責任和算法本身分割開來,委派給不同的對象管理。策略模式通常把一個系列的算法包裝到一系列的策略類裡面,作為一個抽象策略類的子類。用一句話來說,就是:“準備一組算法,並將每一個算法封裝起來,使得它們可以互換” 代碼案例如下: interface MemberStrategy { public double calcPrice(double booksPrice); } class PrimaryMemberStrategy implements MemberStrategy { @Override public double calcPrice(double booksPrice) { System.out.println("對於初級會員的沒有折扣"); return booksPrice; } } class AdvancedMemberStrategy implements MemberStrategy { @Override public double calcPrice( double booksPrice) {System.out.println("對於高級會員的折扣為20%"); return booksPrice * 0.8; } } class Price { private MemberStrategy strategy; //持有一個具體的策略對象 public Price(MemberStrategy strategy){ this.strategy = strategy; //傳入具體的策略對象 } public double quote(double booksPrice){ return this.strategy.calcPrice(booksPrice); } } public class Test { public static void main(String[] args) { //選擇並創建需要使用的策略對象 MemberStrategy strategy = new AdvancedMemberStrategy(); //創建環境 Price price = new Price(strategy); //計算價格 double quote = price.quote(300); System.out.println("圖書的最終價格為:" + quote); } } |
閱讀更多 跟老司機學Java 的文章