基本概念
装饰者模式,动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式要比生成子类更加灵活。
概念解释
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();
}
}
总结
- 装饰者模式是为已有的功能动态的添加更多的功能的一种方式
- 装饰者模式把每个装饰的功能放置在单独的类中,并且让这个类包裹了它所要装饰的类,因此需要执行特殊的行为时,客户代码就可以在运行时要选择的、按照顺序地使用装饰功能包装对象。
- 把类中的装饰从类中搬除,简化原来的类
- 有效的把类的核心职责和装饰功能区域分割开来,去除重复的逻辑
装饰(Decorator)模式的主要优点有:
- 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
- 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
- 装饰器模式完全遵守开闭原则
其主要缺点是:装饰模式会增加许多子类,过度使用会增加程序得复杂性。
装饰模式主要包含以下角色。
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。