在M和N兩種品牌的手機裏面各作通信錄和遊戲兩種軟件。前提:M和N手機之間不通用。設計模式
以手機品牌爲主體,各自實現軟件。
ide
以手機軟件爲主體,各自適配品牌。
this
即:儘可能使用合成/聚合,儘可能不要使用類繼承。設計
優先使用對象的合成/聚合將有助於你保持每一個類被封裝,並被集中在單個任務上。這樣的類和類繼承層次會保持較小的規模,而且不太可能增加爲不可控制的龐然大物。3d
/** * 手機軟件 * Created by callmeDevil on 2019/12/14. */ public abstract class HandsetSoft { public abstract void run(); }
/** * 手機遊戲 * Created by callmeDevil on 2019/12/14. */ public class HandsetGame extends HandsetSoft{ @Override public void run() { System.out.println("運行手機遊戲"); } }
/** * 手機通信錄 * Created by callmeDevil on 2019/12/14. */ public class HandsetAddressList extends HandsetSoft{ @Override public void run() { System.out.println("運行手機通信錄"); } }
/** * 手機品牌 * Created by callmeDevil on 2019/12/14. */ public abstract class HandsetBrand { protected HandsetSoft soft; // 設置手機軟件 public void setHandsetSort(HandsetSoft sort){ // 品牌須要關注軟件,因此可在機器中安裝軟件,以備運行 this.soft = sort; } public abstract void run(); }
/** * 手機品牌M * Created by callmeDevil on 2019/12/14. */ public class HandsetBrandM extends HandsetBrand{ @Override public void run() { soft.run(); } }
/** * 手機品牌N * Created by callmeDevil on 2019/12/14. */ public class HandsetBrandN extends HandsetBrand{ @Override public void run() { soft.run(); } }
public class Test { public static void main(String[] args) { HandsetBrand ab; System.out.println("---手機品牌N:"); ab = new HandsetBrandN(); ab.setHandsetSort(new HandsetGame()); ab.run(); ab.setHandsetSort(new HandsetAddressList()); ab.run(); System.out.println("---手機品牌M:"); ab = new HandsetBrandM(); ab.setHandsetSort(new HandsetGame()); ab.run(); ab.setHandsetSort(new HandsetAddressList()); ab.run(); } }
---手機品牌N: 運行手機遊戲 運行手機通信錄 ---手機品牌M: 運行手機遊戲 運行手機通信錄
增長一個MP3音樂播放功能,只須要添加一個類,其餘無需改造code
/** * 手機MP3 * Created by callmeDevil on 2019/12/14. */ public class HandsetMP3 extends HandsetSoft{ @Override public void run() { System.out.println("運行手機MP3"); } }
若是是增長一個品牌,也只須要添加一個類對象
/** * 手機品牌S * Created by callmeDevil on 2019/12/14. */ public class HandsetBrandS extends HandsetBrand{ @Override public void run() { soft.run(); } }
將抽象部分與它的實現部分分離,使它們均可以獨立的變化。blog
須要注意的是,實現分離,並非說讓抽象類與其派生類分離,由於這沒有任何意義。實現指的是抽象類和它的派生類用來實現本身的對象。繼承