程序设计优化——装饰者模式
Posted sun-flower1314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序设计优化——装饰者模式相关的知识,希望对你有一定的参考价值。
简介:装饰者模式可以动态添加对象功能。装饰者模式充分利用了合成、聚合复用原则,通过委托机制,复用系统中的各个组件,在运行时,可以将这些功能组件进行叠加,从而构造一个“超级对象”,使其拥有这些组件的功能。
有效分离性能组件和功能组件,从而提升模块的可维护性并增加模块的复用性。
1.主要角色
1)组件接口:组件接口是装饰者和被装饰者的超类或者接口。它定义了被装饰者的核心功能和装饰者需要加强的功能点。
2)具体组件:实现组件接口的核心方法,完成某一个具体的业务逻辑。它也是被装饰的对象。
3)装饰者:实现组件接口,并持有一个具体的被装饰者对象。
4)具体装饰者:具体实现装饰的业务逻辑,即实现了呗分离的各个增强功能点。各个具体装饰者是可以互相叠加的。从而可以构成一个功能更强大的组件对象。
举例如下:
2. 组件接口
IPacketCreator.java
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 "); 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>
装饰一层又一层,只要有这个需求就可以不断进行装饰叠加。从而实现功能。
以上是关于程序设计优化——装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章