装饰者模式--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();
	}

}

具体装饰之上可以抽象出一层装饰者抽象类。

猜你喜欢

转载自blog.csdn.net/cjxtw/article/details/83179960
今日推荐