設計模式簡介
什么是設計模式?
設計模式是可以重復利用的解決方案。軟件開發的先驅或者前輩們將之前在開發中遇到的問題進行總結並給出了解決方案,后輩在遇到這些問題之后直接使用這些方案即可解決問題。比如蓋高樓,都是先挖地基,然后再蓋,如果先蓋樓后挖地基,可能蓋不了幾層,樓就倒了。
裝飾者設計模式
使用場景:
給某個對象的功能進行擴展時,可以考慮使用裝飾者設計模式。
在IO流這部分內容中,JDK的源碼使用了大量的裝飾者設計模式。比如BufferedReader可以對FileReader進行裝飾。
以去拉面館吃拉面為例,一碗面做好后都會向里面加料裝飾,所以先定義一個裝飾拉面的接口,提供一個加料的方法:
/** * 定義一個給面加料的接口 */ public interface NoodleDecorate { void addThings(); }
創建一個拉面(Noodle)類實現NoodleDecorate接口
public class Noodle implements NoodleDecorate { /** * 向面里加東西 */ @Override public void addThings() { System.out.println("加兩片肉末"); System.out.println("加一片蘿卜"); System.out.println("加三根香菜"); } }
普通的拉面做好之后,有人愛吃辣椒,想在拉面中添加辣椒,創建一個辣椒拉面(ChiliNoodle)類
/** * 就是在不改變原有拉面的情況下,添加自己想要的調料 */ public class ChiliNoodle implements NoodleDecorate { private Noodle noodle; public ChiliNoodle(Noodle noodle) { this.noodle = noodle; } @Override public void addThings() { noodle.addThings(); System.out.println("加三勺辣椒"); } }
寫一個測試類
public class NoodleTest { public static void main(String[] args) { /** * 獲取加過辣椒的面 */ new ChiliNoodle(new Noodle()).addThings(); } }
這樣就獲得了加過料的拉面了,或者你不想要辣椒,想加雞蛋的話,也可以自己加,而不用重新做一碗面
(總結)裝飾者設計模式的優點:
不用修改被裝飾對象的源碼,裝飾者與被裝飾者耦合度不高。