Java設計模式——裝飾模式——主幹確定 調整細節

場景

裝飾模式主要適用於主幹功能都已確定,在外圍功能上可以隨意添加模塊的情況。

例如,對字符串進行編碼,主幹功能是對字符串進行加密,後來還想實現再字符串頭部和尾部添加標誌符。

由於不同的對接客戶端對標誌符的要求不同,此處就可以使用裝飾模式,在完成加密後,裝飾不同的頭部、尾部標誌符。

實例

我們的目的還是編碼,所以定義一個編碼接口。

/**
 * 編碼器接口
 */
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$
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章