場景
裝飾模式主要適用於主幹功能都已確定,在外圍功能上可以隨意添加模塊的情況。
例如,對字符串進行編碼,主幹功能是對字符串進行加密,後來還想實現再字符串頭部和尾部添加標誌符。
由於不同的對接客戶端對標誌符的要求不同,此處就可以使用裝飾模式,在完成加密後,裝飾不同的頭部、尾部標誌符。
實例
我們的目的還是編碼,所以定義一個編碼接口。
/**
* 編碼器接口
*/
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$
}
}