23種設計模式之裝飾者模式

1.定義:

在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

2.設計原則:

1. 多用組合,少用繼承。
利用繼承設計子類的行爲,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行爲。然而,如果能夠利用組合的做法擴展對象的行爲,就可以在運行時動態地進行擴展。
2. 類應設計的對擴展開放,對修改關閉。

3.UML類圖


4.實例代碼:

抽象類 Brid

package desiner23.Decorator;

public interface Brid {

	public int fly();
}
實體類1 鳥1號,現在可飛50m

package desiner23.Decorator;

public class Brid1 implements Brid {

	public int flyInstance = 50;
	
	public Brid1(int flyInstance) {
		super();
		this.flyInstance = flyInstance;
	}

	public int getFlyInstance() {
		return flyInstance;
	}

	public void setFlyInstance(int flyInstance) {
		this.flyInstance = flyInstance;
	}

	@Override
	public int fly() {
		// TODO Auto-generated method stub
		return this.flyInstance;
	}

}
鳥2號

package desiner23.Decorator;

public class Brid2 implements Brid {

	private int flydistance ;
	
	public Brid2(int flydistance) {
		super();
		this.flydistance = flydistance;
	}

	@Override
	public int fly() {
		// TODO Auto-generated method stub
		return this.flydistance;
	}

}

裝飾抽象類 BridDecoratorAbs
package desiner23.Decorator;

public class BridDecoratorAbs implements Brid {

	public Brid brid;
	public  int addFlyDistance;
	public BridDecoratorAbs(){
		
	}
	public BridDecoratorAbs(Brid brid, int addFlyDistance) {
		super();
		this.brid = brid;
		this.addFlyDistance = addFlyDistance;
	}

	@Override
	public int fly() {
		// TODO Auto-generated method stub
		return 0;
	}

}

裝飾實例1 
package desiner23.Decorator;

public class BridDecoratorOne extends BridDecoratorAbs {

//	private int addFlyDistance;
	public BridDecoratorOne(){
		
	}
	
	public BridDecoratorOne(Brid brid,int addFlyDistance){
		this.brid= brid;
		this.addFlyDistance = addFlyDistance;
	}

	@Override
	public int fly() {
		return this.brid.fly()+this.addFlyDistance;
	}
	
}
裝飾實例2

package desiner23.Decorator;

public class BridDecoratorTwo extends BridDecoratorAbs {

	public BridDecoratorTwo() {
		super();
		// TODO Auto-generated constructor stub
	}

	public BridDecoratorTwo(Brid brid, int addFlyDistance) {
		super(brid, addFlyDistance);
		// TODO Auto-generated constructor stub
	}

	@Override
	public int fly() {
		return this.brid.fly()+this.addFlyDistance;
	}
	
}
測試
package desiner23.Decorator;

public class Testr {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Brid brid1 = new Brid1(20);
		Brid brid2 = new Brid2(25);
		Brid brid3 = new BridDecoratorOne(brid1,24);
		Brid brid4 = new BridDecoratorTwo(brid2,50);
		Brid brid5= new BridDecoratorTwo(brid3,50);
		System.out.println(brid3.fly());
		System.out.println(brid4.fly());
		System.out.println(brid5.fly());
	}

}

輸出:

44
75
94

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章