设计模式之装饰模式

装饰模式的概念

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

装饰模式也是一种给类增加功能的设计模式,还是结合具体实例来分析。

举个栗子

下面是装饰模式的模型图

装饰者模式中有四种角色:构件抽象,具体构件,装饰角色,具体装饰角色。下面来编码体验一下

  • 构建抽象
1
2
3
4
public abstract class Component {
//抽象方法
public abstract void operate();
}
  • 具体构件
1
2
3
4
5
6
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("do something");
}
}
  • 装饰角色
1
2
3
4
5
6
7
8
9
10
11
12
public class Decorator extends Component {
private Component component=null;
//传递被修饰者
public Decorator(Component component){
this.component=component;
}
@Override
public void operate() {
//委托给被修饰者执行
this.component.operate();
}
}
  • 具体装饰角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class ConcreteDecorator1 extends Decorator{
public ConcreteDecorator1(Component component) {
super(component);
}
private void method1(){
System.out.println("method1修饰");
}
@Override
public void operate() {
this.method1();
super.operate();
}
}
public class ConcreteDecorator2 extends Decorator{
public ConcreteDecorator2(Component component) {
super(component);
}
private void method2(){
System.out.println("method2修饰");
}
@Override
public void operate() {
super.operate();
this.method2();
}
}
  • 调用场景
1
2
3
4
5
6
7
8
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
component = new ConcreteDecorator1(component);
component = new ConcreteDecorator2(component);
component.operate();
}
}

输出结果

1
2
3
method1修饰
do something
method2修饰

这就是一个装饰模式的实例,特别简单,装饰着和被装饰着继承同样的抽象,通过多层包装来实现功能扩展。

适用场景

需要扩展一个类,动态的增加功能,而且这些功能还要求能灵活的控制变化,装饰模式会很有用。

优点缺点

装饰着模式的优点就是实现灵活,扩展性好。它是继承扩展的一个替代方案,相比较于继承的方式,装饰模式可以实现多重功能自由排列组合,避免了子类爆炸性增长的可怕局面。

装饰模式的缺点就是多层装饰会增加系统的复杂度,出现问题时候不易修复。

注意事项

装饰模式可以简单理解为是代理模式的一种扩展,不过他们其实不太一样。代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行。而装饰模式中,装饰类对代理对象没有控制权,只能为其增加一层装饰,以加强被装饰对象的功能,仅此而已。

最典型的装饰模式实例就是jdk总io相关类的设计,使用过的应该会深有体会。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!