1.意图:
在一个对象的外围创建一个称为装饰器的封装,动态地给这个对象添加一些额外的功能。
2.类图:
3.原理:
在一个对象的外围创建一个称为装饰器的封装,动态地给这个对象添加一些额外的功能。以对客户端透明的方式扩展对象的功能。
装饰器模式又称为包裹模式(wrapper),因为一个具体装饰器都将下一个具体装饰器或具体构件类包裹起来。如有三个装饰器类Decorator1, Decorator2, Decorator3,它们的典型的创建过程为new Decorator1(new Decorator2(new Decorator3(new ConcreteComponent()))).
4.特征:
装饰器角色持有一个构件对象的实例,并实现了抽象构件的接口。每一个接口的实现都是委派给所持有的构件对象,并增加新的功能。
5.说明:
优点:
装饰器与继承的目的都是扩展对象的功能,但装饰器提供了比继承更大的灵活性,可以动态的决定是“粘上”还是“去掉”一个装饰。
通过使用不同的具体装饰类和这些类的排列组合,可以创建出很多不同行为的组合。
缺点:
装饰器比继承关系使用更少的类,但比继承关系使用更多的对象,更多的对象会使查错变得更困难,特别是这些对象看上去很像的时候。
6. 模式的简化:
简化必须注意两点:
a.一个装饰器类的接口必须与被装饰的类的接口相容。
b.尽量保持Component作为一个“轻”类。
Component类的职责在于为各个具体装饰器类提供共同的接口,而不是存储数据,所以不要把太多的逻辑和状态放在Component类里面。
省略Component接口,只有一个具体的ConcreteComponent类,则Decorater经常作为ConcreteComponent的子类。
7.代码:
// Component.java 构件类
public abstract class Component
{
public abstract void doSomething();
}
// ConcreteComponent.java 具体构件类
public class ConcreteComponent extends Component
{
public void doSomething()
{
// provide implementation here
}
}
/ / Decorator.java 装饰器抽象类
public abstract class Decorator extends Component
{
protected Component component;
public Decorator(Component component)
{
this.component = component;
}
public void doSomething()
{
component.doSomething();
}
}
// ConcreteDecorator.java 具体装饰器类
public class ConcreteDecorator extends Decorator
{
public ConcreteDecorator(Component component)
{
super(component);
}
private void addedBehavior()
{
// some extra functionality goes here
}
public void doSomething()
{
component.doSomething();
addedBehavior();
}
}
在一个对象的外围创建一个称为装饰器的封装,动态地给这个对象添加一些额外的功能。
2.类图:
3.原理:
在一个对象的外围创建一个称为装饰器的封装,动态地给这个对象添加一些额外的功能。以对客户端透明的方式扩展对象的功能。
装饰器模式又称为包裹模式(wrapper),因为一个具体装饰器都将下一个具体装饰器或具体构件类包裹起来。如有三个装饰器类Decorator1, Decorator2, Decorator3,它们的典型的创建过程为new Decorator1(new Decorator2(new Decorator3(new ConcreteComponent()))).
4.特征:
装饰器角色持有一个构件对象的实例,并实现了抽象构件的接口。每一个接口的实现都是委派给所持有的构件对象,并增加新的功能。
5.说明:
优点:
装饰器与继承的目的都是扩展对象的功能,但装饰器提供了比继承更大的灵活性,可以动态的决定是“粘上”还是“去掉”一个装饰。
通过使用不同的具体装饰类和这些类的排列组合,可以创建出很多不同行为的组合。
缺点:
装饰器比继承关系使用更少的类,但比继承关系使用更多的对象,更多的对象会使查错变得更困难,特别是这些对象看上去很像的时候。
6. 模式的简化:
简化必须注意两点:
a.一个装饰器类的接口必须与被装饰的类的接口相容。
b.尽量保持Component作为一个“轻”类。
Component类的职责在于为各个具体装饰器类提供共同的接口,而不是存储数据,所以不要把太多的逻辑和状态放在Component类里面。
省略Component接口,只有一个具体的ConcreteComponent类,则Decorater经常作为ConcreteComponent的子类。
7.代码:
// Component.java 构件类
public abstract class Component
{
public abstract void doSomething();
}
// ConcreteComponent.java 具体构件类
public class ConcreteComponent extends Component
{
public void doSomething()
{
// provide implementation here
}
}
/ / Decorator.java 装饰器抽象类
public abstract class Decorator extends Component
{
protected Component component;
public Decorator(Component component)
{
this.component = component;
}
public void doSomething()
{
component.doSomething();
}
}
// ConcreteDecorator.java 具体装饰器类
public class ConcreteDecorator extends Decorator
{
public ConcreteDecorator(Component component)
{
super(component);
}
private void addedBehavior()
{
// some extra functionality goes here
}
public void doSomething()
{
component.doSomething();
addedBehavior();
}
}