天天看點

[設計模式] 裝飾者模式 decorate (Head First 設計模式)一. 開閉原則二. 裝飾者模式描述二. 代碼四. 測試代碼五. 裝飾 java.io 類

文章目錄

  • 一. 開閉原則
  • 二. 裝飾者模式描述
  • 二. 代碼
  • 四. 測試代碼
  • 五. 裝飾 java.io 類
源碼和圖檔來自 head first 設計模式

一. 開閉原則

類應該對擴充開放, 對修改關閉;

二. 裝飾者模式描述

裝飾者模式, 動态地将責任附加到對象上.若要擴充功能, 裝飾者提供了比繼承更有彈性的替代方案

[設計模式] 裝飾者模式 decorate (Head First 設計模式)一. 開閉原則二. 裝飾者模式描述二. 代碼四. 測試代碼五. 裝飾 java.io 類
[設計模式] 裝飾者模式 decorate (Head First 設計模式)一. 開閉原則二. 裝飾者模式描述二. 代碼四. 測試代碼五. 裝飾 java.io 類
[設計模式] 裝飾者模式 decorate (Head First 設計模式)一. 開閉原則二. 裝飾者模式描述二. 代碼四. 測試代碼五. 裝飾 java.io 類

完整代碼下載下傳

二. 代碼

高層抽象 Beverage

public abstract class Beverage {

	String description = "Unknown Beverage";
	
	public String getDescription() {
		return description;
	}
	
	public abstract double cost();
}
           
public class Espresso extends Beverage {

	public Espresso() {
		description = "Espresso";
	}
	
	@Override
	public double cost() {
		return 1.99;
	}

}
           

裝飾器 CondimentDecorator

public abstract class CondimentDecorator extends Beverage {

	public abstract String getDescription();

}
           
public class Milk extends CondimentDecorator {

	Beverage beverage;
	
	public Milk(Beverage beverage) {
		super();
		this.beverage = beverage;
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + " ," + "Milk";
	}

	@Override
	public double cost() {
		return .33 + beverage.cost();
	}

}
           

四. 測試代碼

public class StarbuzzCoffee {

	public static void main(String[] args) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() + " $" + beverage.cost());
		
		Beverage beverage2 = new DarkRoast();
		
		beverage2 = new Mocha(beverage2);
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
		System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
		
		Beverage beverage3 = new HouseBlend();
		beverage3 = new Mocha(beverage3);
		beverage3 = new Soy(beverage3);
		beverage3 = new Whip(beverage3);
		System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
	}

}
           

輸出:

Espresso $1.99
Dark Roast Coffee, Mocha, Mocha ,Whip $1.06
House Blend Coffee, Mocha ,Soy ,Whip $2.08
           

五. 裝飾 java.io 類

[設計模式] 裝飾者模式 decorate (Head First 設計模式)一. 開閉原則二. 裝飾者模式描述二. 代碼四. 測試代碼五. 裝飾 java.io 類

實作轉小寫的出入流

public class LowerCaseInputStream extends FilterInputStream {

	public LowerCaseInputStream(InputStream inputStream) {
		super(inputStream);
	}

	@Override
	public int read() throws IOException {
		int c = super.read();
		return (c == -1 ? c : Character.toLowerCase((char)c));
	}

}
           

測試代碼

public static void toLower() {
		int c;
		try {
			InputStream in = new LowerCaseInputStream(
					new BufferedInputStream(
							new FileInputStream("count.txt")));
			StringBuilder sb = new StringBuilder();
			while((c = in.read()) != -1) {
				sb.append((char)c);
			}
			System.out.println(sb.toString());
			in.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
           

輸出:

APP.CHEN.COM

1
app.chen.com

1