設計模式學習之裝飾模式
阿新 • • 發佈:2018-11-07
裝飾模式(Decorator)又被稱為包裝模式,是繼承的一種替代方案,繼承對類的擴充套件是編譯時就確定的,裝飾模式可以對客戶端透明的方式擴充套件物件功能,擴充套件是動態的比繼承更具靈活性。
舉個例子就拿程式設計師平時愛喝的咖啡作為例子吧,很多人愛喝咖啡,有人喜歡加糖的,有人喜歡加奶的,有人喜歡加菊花的,也有人喜歡加芥末的。現在有個咖啡店如果利用繼承來實現需要有個咖啡基類,然後繼承後生成加糖的子類,加奶的子類,加菊花的子類等等,看著沒有任何問題。
某一天來了一個人,他要一杯加糖加奶的咖啡,怎麼辦只要再生成一個加糖加奶的咖啡,然後又來一個人他想要一杯加糖加芥末的咖啡,。。。。如果再次擴大咖啡新增的種類,組合起來將是一個龐大的數目,這時裝飾模式就派上了用場,利用裝飾類就可以簡單的生成添加了各種作料的咖啡。
裝飾模式類圖:
解釋:
Component:抽象元件角色,一個介面。
ConcreteComponent:具體元件角色,具體的類,實現了方法。類似咖啡
Decorator:抽象裝飾類,持有Component,具有和Component相同的介面方法
ConcreateDecorator:具體的裝飾類,實現具體方法的擴充套件。
示例程式碼:
public interface ICoffee {
public void operation();
}
public class Coffee implements ICoffee{ @Override public void operation() { System.out.println("原始的咖啡製作工藝"); } }
public class CDecorator implements ICoffee {
private ICoffee coffee;
public CDecorator(ICoffee coffee) {
this.coffee = coffee;
}
@Override
public void operation() {
coffee.operation();
}
}
public class MilkCDecorator extends CDecorator { public MilkCDecorator(ICoffee coffee) { super(coffee); } @Override public void operation() { super.operation(); System.out.println("add milk"); System.out.println("add milk hunhe"); } }
public class SugarCDecorator extends CDecorator {
public SugarCDecorator(ICoffee coffee) {
super(coffee);
}
@Override
public void operation() {
super.operation();
System.out.println("add sugar");
System.out.println("add sugar hunhe");
}
}
public class Test {
public static void main(String[] args) {
Coffee coffee = new Coffee();
MilkCDecorator md = new MilkCDecorator(coffee);
SugarCDecorator sd = new SugarCDecorator(md);
sd.operation();
}
}
result:
原始的咖啡製作工藝
add milk
add milk hunhe
add sugar
add sugar hunhe
java原始碼中IO操作用到的流中使用了大量的裝飾模式。