一、什么是装饰器模式?
也就是对某一业务进行装饰,不同的装饰器分为不同的组件,互相不牵制,都是为了装饰某一共同业务。
用代码实践比较容易明白
二、代码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());
}
}
输出为:
也可以这样:
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());
}
}
输出为:
以上只是对装饰器模式的一个浅显的理解,后续有待深入...