天天看點

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

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