场景
装饰模式主要适用于主干功能都已确定,在外围功能上可以随意添加模块的情况。
例如,对字符串进行编码,主干功能是对字符串进行加密,后来还想实现再字符串头部和尾部添加标志符。
由于不同的对接客户端对标志符的要求不同,此处就可以使用装饰模式,在完成加密后,装饰不同的头部、尾部标志符。
实例
我们的目的还是编码,所以定义一个编码接口。
/**
* 编码器接口
*/
public interface Encoder {
public String execute(String input);
}
定义一个主要编码器,实现加密算法。
/**
* 主要编码器
*/
public class MainEncoder implements Encoder {
@Override
public String execute(String input) {
input=input.replaceAll("1", "q");
input=input.replaceAll("2", "w");
input=input.replaceAll("3", "e");
input=input.replaceAll("4", "r");
return input;
}
}
定义一个装饰器,用于装饰编码结果的头部。注意,实现Encoder接口是为了保证装饰器主要功能也是编码,是为了规范装饰器的主要行为。装饰器通过调用主要编码器来实现主干功能,然后附加一部分装饰器的功能,即头部添加"#"
。
/**
* 头部装饰器
*/
public class HeadDecorator implements Encoder {
private Encoder encoder;
public HeadDecorator(Encoder encoder) {
this.encoder = encoder;
}
@Override
public String execute(String input) {
if (encoder != null) {
return "#" + encoder.execute(input);
} else {
return "";
}
}
}
定义一个装饰器,用于装饰编码结果的尾部。装饰器可以定义无数个,根据需要定义即可。
/**
* 尾部装饰器
*/
public class TailDecorator implements Encoder {
private Encoder encoder;
public TailDecorator(Encoder encoder) {
this.encoder = encoder;
}
@Override
public String execute(String input) {
if (encoder != null) {
return encoder.execute(input) + "$";
} else {
return "";
}
}
}
测试,通过为编码器追加两个装饰器,来实现对编码结果的额外装饰效果:
public class Main {
public static void main(String[] args) {
MainEncoder main = new MainEncoder();
HeadDecorator head = new HeadDecorator(main);
TailDecorator tail = new TailDecorator(head);
System.out.println(tail.execute("1234"));// 输出#qwer$
}
}