java設計模式-裝飾模式三
阿新 • • 發佈:2019-01-05
定義:裝飾(Decorator)模式又叫包裝模式。允許向一個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的一個包裝。通過一種對客戶端透明的方式來擴充套件物件的功能,是繼承關係的一個替代方案。
意圖:動態地給一個物件新增一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活。
主要解決:一般的,我們為了擴充套件一個類經常使用繼承方式實現,由於繼承為類引入靜態特徵,並且隨著擴充套件功能的增多,子類會很膨脹。
何時使用:在不想增加很多子類的情況下擴充套件類。
優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴充套件一個實現類的功能。
缺點:多層裝飾比較複雜。
步驟 1
建立一個介面:
/*汽車基類*/
public interface Car {
public void run();
public void sendSomething();
}
步驟 2
建立實現介面的實體類。
/*小轎車*/ public class Sedan implements Car{ public void run() { System.out.println("小轎車在跑"); } public void sendSomething() { System.out.println("小轎車運送東西"); } }
/*大卡車*/
public class Truck implements Car{
public void run() {
System.out.println("大卡車在跑");
}
public void sendSomething() {
System.out.println("大卡車在運送東西");
}
}
步驟 3
建立實現了 Car介面的抽象裝飾類。
/*建立實現了 Car 介面的抽象裝飾類。 */ public class CarDecorator implements Car{ protected Car decoratorcar; public CarDecorator(Car decoratorcar) { super(); this.decoratorcar = decoratorcar; } public void run() { decoratorcar.run(); } public void sendSomething() { decoratorcar.sendSomething(); } }
步驟 4
建立擴充套件了 CarDecorator類的實體裝飾類。
/*高鐵
* 建立擴充套件了 CarDecorator 類的實體裝飾類。
* */
public class HighSpeedRailCarDecorator extends CarDecorator{
public HighSpeedRailCarDecorator(Car decoratorcar) {
super(decoratorcar);
}
public void run() {
super.run();
decoratorcar.run();
decoratorcar.sendSomething();
setHighSpeedRail(decoratorcar);
}
private void setHighSpeedRail(Car decoratorcar) {
System.out.println("高鐵在執行");
}
}
步驟 5
使用 DecoratorPatternDemo來裝飾 Car物件。
public class DecoratorPatternDemo {
public static void main(String[] args) {
Car sedan=new Sedan();
Car highspeedrail=new HighSpeedRailCarDecorator(sedan);
highspeedrail.run();
System.out.println();
Car truck=new Truck();
Car highspeedrail1=new HighSpeedRailCarDecorator(truck);
highspeedrail1.run();
}
}
步驟 6
執行程式,輸出結果:
小轎車在跑
小轎車在跑
小轎車運送東西
高鐵在執行
大卡車在跑
大卡車在跑
大卡車在運送東西
高鐵在執行