美文网首页
装饰器模式

装饰器模式

作者: 落雨松 | 来源:发表于2019-04-27 11:24 被阅读0次

一、什么是装饰器模式?

也就是对某一业务进行装饰,不同的装饰器分为不同的组件,互相不牵制,都是为了装饰某一共同业务。

用代码实践比较容易明白

二、代码demmo

首先得清楚装饰器模式的四大组件:
①组件接口

/**
 * @Author : WJ
 * @Date : 2019/4/27/027 10:44
 * <p>
 * 注释: 组件接口-->定义了被装饰者的核心功能和装饰者要加强的功能点
 */
public interface IPacketCreator {
    String handleContent();
}

②具体组件

package decoration;

/**
 * @Author : WJ
 * @Date : 2019/4/27/027 10:46
 * <p>
 * 注释: 具体组件(未装饰)
 */
public class PacketBodyCreator implements IPacketCreator{
    @Override

    //核心业务,并不包含其他装饰
    public String handleContent() {
        return "Content of Packet";
    }
}

③装饰者 (其中component是需要被装饰的对象)

package decoration;

/**
 * @Author : WJ
 * @Date : 2019/4/27/027 10:47
 * <p>
 * 注释: 负责维护核心组件 component ,告诉子类核心业务由component完成
 */
public abstract class PacketDecorator implements IPacketCreator {
    IPacketCreator component;
    PacketDecorator(IPacketCreator component){
        this.component = component;
    }
}

④具体装饰者

package decoration;

/**
 * @Author : WJ
 * @Date : 2019/4/27/027 10:50
 * <p>
 * 注释: 具体的装饰器,负责对核心内容进行装饰 (这里是进行HTML格式化操作)
 */
public class PacketHTMLHeaderCreator extends PacketDecorator {

    PacketHTMLHeaderCreator(IPacketCreator c){
        super(c);
    }

    //装饰器具体装饰的类容
    @Override
    public String handleContent() {
        StringBuffer sb = new StringBuffer();
        sb.append("<html>");
        sb.append("<body>");
        sb.append(component.handleContent());
        sb.append("</body>");
        sb.append("</html>\n");
        return sb.toString();
    }
}
---------------------------------------------------------------------------

package decoration;

/**
 * @Author : WJ
 * @Date : 2019/4/27/027 10:55
 * <p>
 * 注释: 同PacketHTMLHeaderCreator一样,也是装饰器,只是装饰的内容不同
 */
public class PacketHTTPHeaderCreator extends PacketDecorator {
    PacketHTTPHeaderCreator(IPacketCreator c){
        super(c);
    }
    @Override
    public String handleContent() {
        StringBuffer sb = new StringBuffer();
        sb.append("Cache-Control:no-cache\n");
        sb.append("Date:......");
        sb.append(component.handleContent());
        return sb.toString();
    }
}

⑤具体使用

可以这样:

package decoration;

/**
 * @Author : WJ
 * @Date : 2019/4/27/027 10:58
 * <p>
 * 注释:
 */
public class Main {
    public static void main(String[] a){
        //层层装饰
        IPacketCreator pc = new PacketHTTPHeaderCreator(
                new PacketHTMLHeaderCreator(
                        new PacketBodyCreator()));

        System.out.println(pc.handleContent());
    }
}

输出为:


image.png

也可以这样:

package decoration;

/**
 * @Author : WJ
 * @Date : 2019/4/27/027 10:58
 * <p>
 * 注释:
 */
public class Main {
    public static void main(String[] a){
        //层层装饰(减少html装饰)
        IPacketCreator pc = new PacketHTTPHeaderCreator(
                new PacketBodyCreator());

        System.out.println(pc.handleContent());
    }
}

输出为:


image.png

以上只是对装饰器模式的一个浅显的理解,后续有待深入...

相关文章

网友评论

      本文标题:装饰器模式

      本文链接:https://www.haomeiwen.com/subject/mmihnqtx.html