1. 程式人生 > >java設計模式-裝飾模式三

java設計模式-裝飾模式三

定義:裝飾(Decorator)模式又叫包裝模式。允許向一個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的一個包裝。通過一種對客戶端透明的方式來擴充套件物件的功能,是繼承關係的一個替代方案。

意圖:動態地給一個物件新增一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活。

主要解決:一般的,我們為了擴充套件一個類經常使用繼承方式實現,由於繼承為類引入靜態特徵,並且隨著擴充套件功能的增多,子類會很膨脹。

何時使用:在不想增加很多子類的情況下擴充套件類。

優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴充套件一個實現類的功能。

缺點:多層裝飾比較複雜。

步驟 1

建立一個介面:

/*汽車基類*/
public interface Car {
	
	public void run();
	
	public void  sendSomething();

}

步驟 2

建立實現介面的實體類。

/*小轎車*/
public class Sedan implements Car{

	public void run() {
		System.out.println("小轎車在跑");
	}

	public void sendSomething() {
		System.out.println("小轎車運送東西");
	}

}
/*大卡車*/
public class Truck implements Car{

	public void run() {
		System.out.println("大卡車在跑");
		
	}

	public void sendSomething() {
		System.out.println("大卡車在運送東西");
		
	}

}

步驟 3

建立實現了 Car介面的抽象裝飾類。

/*建立實現了 Car 介面的抽象裝飾類。
*/
public class CarDecorator implements Car{
	protected Car decoratorcar;
	

	public CarDecorator(Car decoratorcar) {
		super();
		this.decoratorcar = decoratorcar;
	}

	public void run() {
		decoratorcar.run();		
	}

	public void sendSomething() {
		decoratorcar.sendSomething();		
	}

}

步驟 4

建立擴充套件了 CarDecorator類的實體裝飾類。

/*高鐵
 * 建立擴充套件了 CarDecorator 類的實體裝飾類。
 * */
public class HighSpeedRailCarDecorator extends CarDecorator{

	public HighSpeedRailCarDecorator(Car decoratorcar) {
		super(decoratorcar);
	}
	
	public void run() {
		super.run();
		decoratorcar.run();
		decoratorcar.sendSomething();
		setHighSpeedRail(decoratorcar);
	}
	private void setHighSpeedRail(Car decoratorcar) {
		System.out.println("高鐵在執行");
	}
}

步驟 5

使用 DecoratorPatternDemo來裝飾 Car物件。

public class DecoratorPatternDemo {
	public static void main(String[] args) {
		Car sedan=new Sedan();
		Car highspeedrail=new HighSpeedRailCarDecorator(sedan);
		highspeedrail.run();
		System.out.println();
		Car truck=new Truck();
		Car highspeedrail1=new HighSpeedRailCarDecorator(truck);
		highspeedrail1.run();
	}

}

步驟 6

執行程式,輸出結果:

小轎車在跑
小轎車在跑
小轎車運送東西
高鐵在執行

大卡車在跑
大卡車在跑
大卡車在運送東西
高鐵在執行