一、模式定义
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活。【针对对象】
二、模式类图
![](https://img.haomeiwen.com/i1183162/f69f6a77e58cae2e.jpeg)
三、示例代码
public interface Component
{
public void operate();
}
public class ConcreteComponent implements Component
{
public void operate()
{
System.out.println("do something");
}
}
public abstract class Decorator implements Component
{
private Component component = null;
public Decorator(Component component)
{
this.component = component;
}
public void operate()
{
this.component.operate();
}
}
public class ConcreteDecorator1 extends Decorator
{
public ConcreteDecorator1(Component component)
{
super(component);
}
private void method()
{
System.out.println("ConcreteDecorator1 method 修饰");
}
public void operate()
{
this.method();
super.operate();
}
}
public class ConcreteDecorator2 extends Decorator
{
public ConcreteDecorator1(Component component)
{
super(component);
}
private void method()
{
System.out.println("ConcreteDecorator2 method 修饰");
}
public void operate()
{
this.method();
super.operate();
}
}
public class client
{
public static void main(String[] args)
{
// 创建被装饰对象
Component component = new ConcreteComponent();
// 第一次装饰
component = new ConcreteDecorator1(component);
// 第二次装饰
component = new ConcreteDecorator2(component);
component.operate();
}
}
四、模式优缺点
- 优点
- 装饰类与被装饰类可以独立发展,而不会相互耦合。
- 装饰模式是继承关系的替代方案。实现的是is-a关系
- 动态的扩展一个实现类的功能
- 缺点
- 多层的装饰是比较复杂的
五、何时选用
- 需要扩展一个类的功能,或给一个类增加附加功能。
- 需要动态地给一个对象增加功能,这些功能可以再动态地撤消。
- 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
网友评论