1. 場景
裝飾模式主要适用于主幹功能都已确定,在外圍功能上可以随意添加子產品的情況。
例如,對字元串進行編碼,主幹功能是對字元串進行加密,後來還想實作再字元串頭部和尾部添加标志符。
由于不同的對接用戶端對标志符的要求不同,此處就可以使用裝飾模式,在完成加密後,裝飾不同的頭部、尾部标志符。
2. 執行個體
我們的目的還是編碼,是以定義一個編碼接口。
/**
* 編碼器接口
*/
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$
}
}
————————————————
版權聲明:本文為CSDN部落客「熊貓大哥大」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/woshisangsang/article/details/105268297