Decorator(裝飾者)模式
阿新 • • 發佈:2020-11-23
1.Decorator模式解決什麼問題?
2.實現Decorator模式
3.小結
#Decorator模式解決什麼問題?
定義:裝飾模式指的是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。
java.io包也是基於此模式組織程式碼,學習Decorator程式碼能幫助理解IO包
#實現Decorator模式
為了練手,我們來模擬電腦外設接入電腦主機,也就是用外設來裝飾電腦
首先定義一個Computer的抽象類
package com.mike.pattern.decorator.eg1; /** * @author mike * @date 2020-11-24 * @desc 定義被裝飾者 */ public abstract class Computer { public abstract void connectingDevices(); }
被裝飾者具體實現及初始資訊
package com.mike.pattern.decorator.eg1;
/**
* @author mike
* @date 2020-11-24
* @desc 定義被裝飾者具體實現
*/
public class Desktop extends Computer {
public void connectingDevices() {
System.out.println("當前未連線任何外接裝置");
}
}
裝飾者
package com.mike.pattern.decorator.eg1; /** * @author mike * @date 2020-11-24 * @desc 定義裝飾者 */ public abstract class Decorator extends Computer { public Computer computer; public Decorator(Computer computer) { this.computer = computer; } public void connectingDevices() { computer.connectingDevices(); } }
滑鼠裝飾類
package com.mike.pattern.decorator.eg1; /** * @author mike * @date 2020-11-23 * @desc 定義滑鼠裝飾 */ public class DecoratorMouse extends Decorator { public DecoratorMouse(Computer computer) { super(computer); } @Override public void connectingDevices() { super.connectingDevices(); System.out.println("滑鼠已經連結"); } }
鍵盤裝飾類
package com.mike.pattern.decorator.eg1;
/**
* @author mike
* @date 2020-11-23
* @desc 定義鍵盤裝飾器
*/
public class DecoratorKeybord extends Decorator {
public DecoratorKeybord(Computer computer) {
super(computer);
}
@Override
public void connectingDevices() {
super.connectingDevices();
System.out.println("鍵盤已經連結");
}
}
測試類
package com.mike.pattern.decorator.eg1;
/**
* @author mike
* @date 2020-11-23
* @desc 測試裝飾
*/
public class Test {
public static void main(String[] args) {
Desktop desktop = new Desktop();
Decorator decorator = new DecoratorKeybord(new DecoratorMouse(desktop));
decorator.connectingDevices();
}
}
輸出
#小結
學習設計模式最好的辦法是先打好基礎,尤其是有關,抽象類,介面方面的知識,加上多使用IDE斷點除錯功能,分析程式碼呼叫鏈,別人的文章只能給你指路,設計模式屬於只能意會沒法言傳的一類知識,自己多思考,多敲程式碼才能體會其思想。
參考文章:https://blog.csdn.net/jason0539/article/details/22713711