设计模式之装饰者模式
装饰者模式: 动态地给一个对象装饰些额外的功能.
文章目录
一、装饰者模式是什么?
装饰者模式是动态地给一个对象装饰些额外的功能,若要扩展功能,装饰者提供了比继承更有弹性的替代方案,比生成子类更加灵活。
通常在继承关系中,为了扩展功能需要新增子类进行扩展,而装饰者模式,可以在不扩展子类的情况下,将对象的功能进行动态的扩展。
装饰者模式类图如下:
抽象构件(Component): 给出一个抽象接口,以规范接收附加功能的对象。
具体构件(ConcreteComponent): 定义一个将要接收附加功能的类。
装饰者(Decorat): 持有一个构件对象的实例,并定义一个与构件接口一致的接口。
具体装饰者(ConcretDecorat1,ConcretDecorat2): 负责给构件对象添加附加的功能。
测试类(DecoratTest): 测试装饰是否成功。
二、具体代码
1.Component类
代码如下(示例):
/**
* 抽象构件
*/
public abstract class Component {
public abstract void operate();
}
2.ConcreteComponent类
代码如下(示例):
/**
* 具体构件
*/
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("具体构件");
}
}
3.Decorat类
代码如下(示例) :
/**
* 装饰者
*/
public abstract class Decorat extends Component {
private Component component;
public Decorat(Component component){
this.component = component;
}
@Override
public void operate() {
component.operate();
}
}
4.ConcretDecorat类
代码如下(示例) :
/**
* 具体装饰者1
*/
public class ConcreteDecorat1 extends Decorat {
public ConcreteDecorat1(Component component) {
super(component);
}
private void method1(){
System.out.println("装饰方法1");
}
@Override
public void operate() {
method1();
super.operate();
}
}
/**
* 具体装饰者2
*/
public class ConcreteDecorat2 extends Decorat {
public ConcreteDecorat2(Component component) {
super(component);
}
private void method1(){
System.out.println("装饰方法2");
}
@Override
public void operate() {
method1();
super.operate();
}
}
5.DecoratTest类
代码如下(示例) :
/**
* @author haowu
* @create 2021-09-25-21:41
* @Description 测试类
*/
public class DecoratTest {
@Test
public void testDecorat() {
Component concreteComponent = new ConcreteComponent();
concreteComponent = new ConcreteDecorat1(concreteComponent);
concreteComponent = new ConcreteDecorat2(concreteComponent);
concreteComponent.operate();
}
}
运行结果
总结
通过测试类,我们可以看到,客户端可以随意进行功能的添加,由客户端进行动态的执行放入的顺序,每个人放入的顺序不同,通过装饰者模式可以进行不同的组装来完成需求的变更。
装饰模式允许系统动态决定增加一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。通过使用不同的具体装饰类以及这些装饰类的排列组合,就可以创造出很多不同行为的组合。
注: 文字解释部分参考于https://zhuanlan.zhihu.com/p/65113766