簡介:裝飾者模式能夠動態添加對象功能。裝飾者模式充分利用了合成、聚合複用原則,經過委託機制,複用系統中的各個組件,在運行時,能夠將這些功能組件進行疊加,從而構造一個「超級對象」,使其擁有這些組件的功能。html
有效分離性能組件和功能組件,從而提高模塊的可維護性並增長模塊的複用性。java
1.主要角色app
1)組件接口:組件接口是裝飾者和被裝飾者的超類或者接口。它定義了被裝飾者的核心功能和裝飾者須要增強的功能點。性能
2)具體組件:實現組件接口的核心方法,完成某一個具體的業務邏輯。它也是被裝飾的對象。測試
3)裝飾者:實現組件接口,並持有一個具體的被裝飾者對象。this
4)具體裝飾者:具體實現裝飾的業務邏輯,即實現了唄分離的各個加強功能點。各個具體裝飾者是能夠互相疊加的。從而能夠構成一個功能更強大的組件對象。spa
舉例以下:code
2. 組件接口component
IPacketCreator.javahtm
package com.hxc.book.component; /** * <p>Description: 組件接口</p> * @author Huang Xiaocong * @data 2019年11月17日 */ public interface IPacketCreator { public String handleRequest(); }
3.具體組件
PacketBodyCreator.java
package com.hxc.book.component; /** * <p>Description: 具體接口(被裝飾者)</p> * @author Huang Xiaocong * @data 2019年11月17日 */ public class PacketBodyCreator implements IPacketCreator { public String handleRequest() { return "Create Body of Packet!!"; } }
4.裝飾者(抽象類)
PacketDecorator
package com.hxc.book.component; /** * <p>Description: 裝飾者</p> * @author Huang Xiaocong * @data 2019年11月17日 */ public abstract class PacketDecorator implements IPacketCreator { IPacketCreator iPacketCreator; public PacketDecorator(IPacketCreator iPacketCreator) { this.iPacketCreator = iPacketCreator; } }
5.具體裝飾者
裝飾者一:PacketHtmlHeaderCreator.java
package com.hxc.book.component; /** * <p>Description: 具體裝飾者一</p> * @author Huang Xiaocong * @data 2019年11月17日 */ public class PacketHtmlHeaderCreator extends PacketDecorator { public PacketHtmlHeaderCreator(IPacketCreator iPacketCreator) { super(iPacketCreator); } public String handleRequest() { StringBuffer sb = new StringBuffer(); sb.append("<html>"); sb.append("<body>"); sb.append(iPacketCreator.handleRequest()); sb.append("</body>"); sb.append("</html>"); return sb.toString(); } }
裝飾者二:PacketHTTPHeaderCreator.java
package com.hxc.book.component; import java.util.Date; /** * <p>Description: 具體裝飾者</p> * @author Huang Xiaocong * @data 2019年11月17日 */ public class PacketHTTPHeaderCreator extends PacketDecorator { public PacketHTTPHeaderCreator(IPacketCreator iPacketCreator) { super(iPacketCreator); } public String handleRequest() { //對給定數據加上Http頭部信息 StringBuffer sb = new StringBuffer(); sb.append("Cache-Control:no-cache\n"); sb.append("Date:" + new Date()); sb.append(iPacketCreator.handleRequest()); return sb.toString(); } }
6.測試的Main方法:
Main.java
package com.hxc.book.component; public class Main { public static void main(String[] args) { IPacketCreator iPacketCreator = new PacketHTTPHeaderCreator(new PacketHtmlHeaderCreator(new PacketBodyCreator())); String handleRequest = iPacketCreator.handleRequest(); System.out.println(handleRequest); } }
控制檯的打印信息以下:
Cache-Control:no-cache
Date:Sun Nov 17 10:04:13 CST 2019<html><body>Create Body of Packet!!</body></html>
裝飾一層又一層,只要有這個需求就能夠不斷進行裝飾疊加。從而實現功能。