大話設計模式筆記(四)——裝飾模式
- 2019 年 10 月 30 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/luo4105/article/details/76546343
第六章裝飾模式
裝飾模式是動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。
裝飾模式UML

裝飾模式的核心是對對象不斷添加裝飾的功能所使用的設計模式。
現有需求人和多種衣服,人需要自主搭配多種衣服,UML結構圖如下

在上面的UML中,Decoiator存在Component對象屬性,在構造器初始化。它的子類的wear方法會調用component.wear();這樣實現Decoiator的子類去裝飾Person類。
程式碼
Componet
public abstractclass Componet { public abstract void wear(); }
Person
public class Person extends Componet{ private Stringname = "小菜"; @Override public void wear() { System.out.println(name+ "穿衣"); } }
Decorator
public class Decorator extends Componet { public Componet componet; public Decorator(Componet componet) { this.componet = componet; } @Override public void wear() { componet.wear(); } }
JeansDecorator
public class JeansDecorator extends Decorator { public JeansDecorator(Componet componet) { super(componet); } @Override public void wear() { super.wear(); System.out.println("穿牛仔褲"); } }
TieDecorator
public class TieDecorator extends Decorator { public TieDecorator(Componet componet) { super(componet); } @Override public void wear() { super.wear(); System.out.println("打領帶"); } }
TShirtDecorator
public class TShirtDecorator extends Decorator { public TShirtDecorator(Componet componet) { super(componet); } @Override public void wear() { super.wear(); System.out.print("穿T恤"); } }
Test
public class Test { public static void main(String[] args) { Decorator tie = new TieDecorator(new Person()); Decorator jeans = new JeansDecorator(tie); Decorator tshirt = new TShirtDecorator(jeans); tshirt.wear(); } }
列印
小菜穿衣
打領帶
穿牛仔褲
穿T恤
總結
裝飾模式是給核心功能添加新的功能,並能按照順序執行。裝飾模式將特定方法封裝到類中,並讓這個類包裝它所需要的裝飾類對象,因此,當需要執行特殊行為時,客戶程式碼就可以在運行時根據需要有選擇地、按順序地使用裝飾功能包裝對象了。
裝飾者模式是應用最普遍的設計模式之一。javaAPI中對裝飾者模式的舉例:Java I/O 庫中 BufferedInputStream、DataInputStream、LineNumberInputStream、PushbackInputStream 等裝飾者類對於 InputStream 的封裝;JavaEE API 中的 ServletRequestWrapper、HttpServletRequestWrapper 對於 ServletRequest 的封裝