標籤:
設計模式
1、定義:是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結
2、優點:代碼複用,易於維護,易於理解性,保證代碼的可靠性
3、分類:設計模式分為3種類型,共23種模式
建立型模式,共五種:Factory 方法模式、抽象原廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、面板模式、橋接模式、組合模式、享元模式。
行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解譯器模式。
4、軟體設計的6大原則:
1)開閉原則(Open Closed Principle,OCP)
開閉原則指的是對擴充開放,對修改關閉。
2) 迪米特法則(最小知識原則)(Principle of Least Knowledge,PLK)
3)裡氏代換原則(Liskov Substitution Principle,LSP)
4)依賴倒轉原則(Dependency Inversion Principle,DIP)
5)介面隔離原則(Interface Segregation Principle,ISP)
6)單一職責原則
設計模式背後所秉承的精神所在是很多的設計原則:
1、把會變化的部分取出來並封裝起來,以便以後可以輕易的改動或擴充此部分,而不影響不需要變化的其他部分
2、針對介面編程,而不是針對實現編程
3、多用組合,少用繼承:組合就是將兩個類結合起來使用,使用組合建立系統具有很大的彈性
設計模式:
1、策略模式(Strategy Pattern):策略模式定義了演算法族,並將其分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶
組成:
舉例說明:鴨子模擬器的設計
1 /** 2 * 所有飛行行為必須實現的介面 3 */ 4 interface FlyBehavior { 5 public void fly(); 6 } 7 /** 8 * 所有呱呱叫行為必須實現的介面 9 */ 10 interface QuackBehavior { 11 public void quack(); 12 } 13 /** 14 * 飛行行為的具體實現1:可以飛行 15 */ 16 class FlyWithWings implements FlyBehavior { 17 @Override 18 public void fly() { 19 System.out.println("I am flying!"); 20 } 21 } 22 /** 23 * 飛行行為的具體實現2:不會飛行 24 */ 25 class FlyNoWay implements FlyBehavior{ 26 @Override 27 public void fly() { 28 System.out.println("I can not fly!"); 29 } 30 } 31 /** 32 * 呱呱叫行為的具體實現1:呱呱叫 33 */ 34 class Quack implements QuackBehavior{ 35 36 @Override 37 public void quack() { 38 System.out.println("Quack"); 39 } 40 } 41 /** 42 * 呱呱叫行為的具體實現2:吱吱叫 43 */ 44 class Squeak implements QuackBehavior{ 45 @Override 46 public void quack() { 47 System.out.println("Squeak"); 48 } 49 } 50 /** 51 * 抽象類別,是所有鴨子的超類,在該類中,定義了行為類型介面的引用變數 52 */ 53 abstract class Duck{ 54 55 FlyBehavior flyBehavior; 56 QuackBehavior quackBehavior; 57 58 public void setFlyBehavior(FlyBehavior flyBehavior) { 59 this.flyBehavior = flyBehavior; 60 } 61 public void setQuackBehavior(QuackBehavior quackBehavior) { 62 this.quackBehavior = quackBehavior; 63 } 64 65 public abstract void dispaly(); 66 67 //將鴨子的行為實現委託給行為類 68 public void fly(){ 69 flyBehavior.fly(); 70 } 71 72 public void quack(){ 73 quackBehavior.quack(); 74 } 75 } 76 77 /** 78 * 定義model duck子類繼承超類duck,並實現超類中的抽象方法 79 */ 80 class ModelDuck extends Duck{ 81 82 public ModelDuck(){ 83 84 flyBehavior = new FlyNoWay(); 85 quackBehavior = new Quack(); 86 } 87 @Override 88 public void dispaly() { 89 System.out.println("I am a model duck!"); 90 } 91 } 92 /** 93 * 測試類別 94 */ 95 public class TestModel{ 96 97 public static void main(String[] args) { 98 99 Duck model = new ModelDuck();100 model.fly();101 model.quack();102 System.out.println("動態更改行為---");103 //調用鴨子的setter方法,在運行時改變鴨子的行為104 model.setFlyBehavior(new FlyWithWings());105 model.setQuackBehavior(new Squeak());106 model.fly();107 model.quack();108 109 }110 111 }View Code
運行結果:
深入淺出設計模式學習筆記:一