1. 程式人生 > >裝飾者模式--Decorator

裝飾者模式--Decorator

1: 作用

動態的給物件增加執行的業務,不受數量限制。可以代替子類,同時避免子類與父類的高耦合。增加靈活性。

2:構成

2.1 裝飾者抽象類--Decorator (可以是介面)

最終生成一個指向被裝飾物件基類(Component)例項的引用,並定義一個與被裝飾物件基類(Component)介面一致的介面。

通過這個抽象類或介面來指向具體的執行物件。

2.2 被裝飾的物件的基類--Component 

放在最裡面核心的位置,用來生成基礎的被裝飾物件,可以給這個物件動態的新增職責。

2.3具體被裝飾物件--ConcreteComponent

生成具體的裝飾物件,其屬性中包含一個裝飾者抽象類Decorator物件,一般擁有一個含參的構造方法,引數為一個裝飾者抽象類Decorator物件,用來設定屬性中的裝飾者抽象類Decorator物件。

2.4 具體的裝飾者 - ConcreteDecorator

最終的操作者,給內部的被裝飾的物件增加(裝飾物件的)職責。

3 例

目的:造一座房子 ;  裝飾:門,窗,床。

可以任意的給這座房子裝飾 門,窗,床中的一種或幾種。順序也可以改變。

//裝飾者抽象類
public interface Build {
	public void act();

}

//具體裝飾
public class BuildBed implements Build {

	Build bud;
	public BuildBed(Build bu){
		this.bud = bu;
	}
	@Override
	public void act() {
		// TODO Auto-generated method stub
		System.out.println("造一架床");
		this.bud.act();
	}

}

//具體裝飾
public class BuildDoor implements Build {
	Build bud;
	public BuildDoor(Build bu){
		this.bud = bu;
	}
	@Override
	public void act() {
		// TODO Auto-generated method stu
		System.out.println("修一個門");
		this.bud.act();

	}

}

//具體裝飾
public class BuildWindow implements Build {
	Build bud;
	public BuildWindow(Build bu){
		this.bud = bu;
	}
	@Override
	public void act() {
		// TODO Auto-generated method stub
		System.out.println("修一個窗");
		this.bud.act();
	}

}

//具體被裝飾物件
public class House implements Build {

	@Override
	public void act() {

		System.out.println("造一座房子");
	}

}


public class test {


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//修一個門;修一個窗;造一座房
		Build bud1 =  new BuildDoor(new BuildWindow(new House()));
		bud1.act();

		//造一架床;修一個窗;修一個門,造一座房
		Build bud2 = new BuildBed( new BuildWindow(new BuildDoor( new House())));
		bud2.act();
	}

}

具體裝飾之上可以抽象出一層裝飾者抽象類。