程序設計優化——(4)裝飾者模式

  簡介:裝飾者模式能夠動態添加對象功能。裝飾者模式充分利用了合成、聚合複用原則,經過委託機制,複用系統中的各個組件,在運行時,能夠將這些功能組件進行疊加,從而構造一個「超級對象」,使其擁有這些組件的功能。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>

 

裝飾一層又一層,只要有這個需求就能夠不斷進行裝飾疊加。從而實現功能。

相關文章
相關標籤/搜索