1. 程式人生 > >設計模式學習之裝飾模式

設計模式學習之裝飾模式

裝飾模式(Decorator)又被稱為包裝模式,是繼承的一種替代方案,繼承對類的擴充套件是編譯時就確定的,裝飾模式可以對客戶端透明的方式擴充套件物件功能,擴充套件是動態的比繼承更具靈活性。

       舉個例子就拿程式設計師平時愛喝的咖啡作為例子吧,很多人愛喝咖啡,有人喜歡加糖的,有人喜歡加奶的,有人喜歡加菊花的,也有人喜歡加芥末的。現在有個咖啡店如果利用繼承來實現需要有個咖啡基類,然後繼承後生成加糖的子類,加奶的子類,加菊花的子類等等,看著沒有任何問題。

      某一天來了一個人,他要一杯加糖加奶的咖啡,怎麼辦只要再生成一個加糖加奶的咖啡,然後又來一個人他想要一杯加糖加芥末的咖啡,。。。。如果再次擴大咖啡新增的種類,組合起來將是一個龐大的數目,這時裝飾模式就派上了用場,利用裝飾類就可以簡單的生成添加了各種作料的咖啡。

裝飾模式類圖:

解釋:

Component:抽象元件角色,一個介面。

ConcreteComponent:具體元件角色,具體的類,實現了方法。類似咖啡

Decorator:抽象裝飾類,持有Component,具有和Component相同的介面方法

ConcreateDecorator:具體的裝飾類,實現具體方法的擴充套件。

示例程式碼:

public interface ICoffee {

	public void operation();
}

public class Coffee  implements ICoffee{

	@Override
	public void operation() {
		
		System.out.println("原始的咖啡製作工藝");
		
	}

}

public class CDecorator implements ICoffee {
	private ICoffee coffee;

	public CDecorator(ICoffee coffee) {
		this.coffee = coffee;
	}
	
	@Override
	public  void  operation() {
		coffee.operation();
	}
}
public class MilkCDecorator extends CDecorator {

	public MilkCDecorator(ICoffee coffee) {
		super(coffee);
	}

	@Override
	public void operation() {
		super.operation();
		System.out.println("add milk");
		System.out.println("add milk hunhe");
	}

}
public class SugarCDecorator extends CDecorator {

	public SugarCDecorator(ICoffee coffee) {
		super(coffee);
	}

	@Override
	public void operation() {
		super.operation();
		System.out.println("add sugar");
		System.out.println("add sugar hunhe");
	}

}
public class Test {

	public static void main(String[] args) {
		Coffee coffee = new Coffee();
		MilkCDecorator md = new MilkCDecorator(coffee);
		SugarCDecorator sd = new SugarCDecorator(md);
		sd.operation();

	}

}

result:

原始的咖啡製作工藝
add milk
add milk hunhe
add sugar
add sugar hunhe

java原始碼中IO操作用到的流中使用了大量的裝飾模式。