设计模式(四)之装饰者模式

基本概念

装饰者模式,动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式要比生成子类更加灵活。

概念解释

设计模式(四)之装饰者模式

Component是定义一个对象接口,可以给这些对象动态的添加职责。ConcreteComponent是定义了一个具体的对象,可以给这个对象添加一个职责。Decorator,装饰抽象类,继承了Component,从外类拓展了Component类的功能,但是对于Component类无需知道Decorator的存在,ConcreteDecorator就是具体的装饰对象,起到给Component添加功能的作用。

也就是说,Component类是被装饰的抽象类,Decorator类是装饰Component的抽象类。Decorator抽象类是继承了Component类,并且给Component类增加了一些额外的功能,但是不影响原本Component对象。Decorator类就像给Component类增加了一件衣服,增加了一些装饰品,所以就叫做装饰模式。

进一步解释,说明这个装饰者模式是一层一层的进行装饰。装饰的过程是首先新建一个ConcreteComponent对象,然后新建concreteDecorator1类,用来装饰ConcreteComponent类。然后第二次新建concreteDecorator2类装饰concreteDecorator1类....concreteDecoratornM类。 不停的进行这样装饰添加新的功能。执行的时候就在concreteDecoratornN就可以加载所装饰的类的具体功能,也可以运行其中装饰过程中的所实现的功能,方法较为灵活。

而且装饰类可以一层套一层,不停的添加新的功能和职责。

具体的代码实现


public class DecoratorDemo {
	// 装饰者模式的实例,采用穿衣服的模式进行讲解
	public static void main(String[] args) {
		Person person = new Person("小菜");
		
		// 装饰的类
		TShirts tShirts = new TShirts();
		BigTrouser bigTrouser = new BigTrouser();
		
		// 装饰过程, 一层一层的装饰上一个对象
		tShirts.Decorate(person);
		bigTrouser.Decorate(tShirts);
		bigTrouser.show();
	}
}
// Person类,可以实现具体的类
class Person{
	private String name;
	
	public Person() {
	}
	
	public Person(String name) {
		this.name = name;
	}
	
	public void show() {
		System.out.println("装饰者:" + name + " ");
	}
}

// 服装装饰类
class Finery extends Person{
	protected Person component;
	
	// 装饰器
	public void Decorate(Person component) {
		this.component = component;
	}
	
	@Override
	public void show() {
		// TODO Auto-generated method stub
//		super.show();
		if(component != null) {
			component.show();
		}
	}
	
}
// 具体的装饰类
class TShirts extends Finery{
	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.print("大T恤 ");
		super.show();
		
	}
}

class BigTrouser extends Finery{
	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.print("垮裤 ");
		super.show();
	}
}

总结

  1. 装饰者模式是为已有的功能动态的添加更多的功能的一种方式
  2. 装饰者模式把每个装饰的功能放置在单独的类中,并且让这个类包裹了它所要装饰的类,因此需要执行特殊的行为时,客户代码就可以在运行时要选择的、按照顺序地使用装饰功能包装对象。
  3. 把类中的装饰从类中搬除,简化原来的类
  4. 有效的把类的核心职责和装饰功能区域分割开来,去除重复的逻辑

装饰(Decorator)模式的主要优点有:

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
  • 装饰器模式完全遵守开闭原则

其主要缺点是:装饰模式会增加许多子类,过度使用会增加程序得复杂性。

装饰模式主要包含以下角色。

  • 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  • 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  • 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  • 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
上一篇:PHP设计模式之装饰器模式(Decorator)


下一篇:python中的装饰器(Decorator)