程序设计优化——装饰者模式

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>

 

装饰一层又一层,只要有这个需求就可以不断进行装饰叠加。从而实现功能。

 

以上是关于程序设计优化——装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式---装饰者模式

Java设计模式之装饰者模式

设计模式 之 装饰者模式

设计模式-装饰者模式(Go语言描述)

设计模式-装饰者模式(Go语言描述)

设计模式整理_装饰者模式