文章目錄
- 開始之前
- 適配器模式
- 使用場景
- 注意事項
- 何時使用
- 優缺點
- 代碼實現
- 原型模式
- 深拷貝和淺拷貝
開始之前
本章節是一個系列,里面用的的代碼實例都是連貫的。在實現某一種設計模式時,為了減少代碼篇幅,前面博客出現model類(僅限公用的model類,比如compute、CPU、Mem、Disk等純對象類)不會重復出現,讀者在閱讀某一篇博客時,如果發現突然出現了一個新的model類,在本片博客中沒有其定義,可以往前面的博客翻一下!
最后,當本系列更新完成后,我會整個的代碼完整貼出來,提供下載鏈接!
適配器模式
使用場景
有動機地修改一個正常運行的系統的接口,這時應該考慮使用適配器模式。
注意事項
適配器不是在詳細設計時添加的,而是解決正在服役的項目的問題。
何時使用
1、系統需要使用現有的類,而此類的接口不符合系統的需要。
2、想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作,這些源類不一定有一致的接口。
3、通過接口轉換,將一個類插入另一個類系中。(比如老虎和飛禽,現在多了一個飛虎,在不增加實體的需求下,增加一個適配器,在里面包容一個虎對象,實現飛的接口。)
優缺點
優點:
- 1、可以讓任何兩個沒有關聯的類一起運行。
- 2、提高了類的復用。
- 3、增加了類的透明度。
- 4、靈活性好。
缺點:
- 1、過多地使用適配器,會讓系統非常零亂,不易整體進行把握。
比如,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現,
一個系統如果太多出現這種情況,無異于一場災難。
因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。 - 2.由于 JAVA 至多繼承一個類,所以至多只能適配一個適配者類,而且目標類必須是抽象類。
代碼實現
現在在之前代碼的基礎上,之前compute只能讀寫磁盤Disk,現在想要能夠適配讀寫SD卡。
public abstract class SDCard {protected abstract String getName();public void readSD(){System.out.println(getName()+" readSD");}public void writeSD(){System.out.println(getName()+" writeSD");}
}public class XiaomiSDCard extends SDCard{@Overrideprotected String getName() {return "xiao mi sdcard";}
}
適配器需要繼承已有的disk類,然后適配新的SD卡類
public class SDCardAdapter extends Disk {private final SDCard sdCard;public SDCardAdapter(SDCard sdCard) {this.sdCard = sdCard;}@Overrideprotected String getName() {return "sd card adapter";}@Overridepublic void read() {sdCard.readSD();}@Overridepublic void write() {sdCard.writeSD();}
}
public class Client {public static void main(String[] args) {System.out.println("正常模式");Compute compute = new ComputeBuilder().power(new V220()).mem(new XiaomiMem()).cpu(new XiaomiCpu()).disk(new XiaomiDisk())//需要適配的地方.build();compute.run();System.out.println("適配器模式");compute = new ComputeBuilder().power(new V220()).mem(new XiaomiMem()).cpu(new XiaomiCpu()).disk(new SDCardAdapter(new XiaomiSDCard()))//適配器模式.build();compute.run();}
}
原型模式
定義:通過復制現有實例來創建新的實例,無需知道相應類的信息。
簡單地理解,其實就是當需要創建一個指定的對象時,我們剛好有一個這樣的對象,但是又不能直接使用,我會clone一個一毛一樣的新對象來使用;基本上這就是原型模式。關鍵字:Clone。
深拷貝和淺拷貝
淺復制:將一個對象復制后,基本數據類型的變量都會重新創建,而引用類型,指向的還是原對象所指向的。
深復制:將一個對象復制后,不論是基本數據類型還有引用類型,都是重新創建的。簡單來說,就是深復制進行了完全徹底的復制,而淺復制不徹底。clone明顯是深復制,clone出來的對象是是不能去影響原型對象的