设计模式学习(十三)装饰模式

介绍

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

类图说明

在这里插入图片描述
还是以车的例子来举例,定义一个ICar接口,该接口有两个实现类BMW和Benz,实现类分别实现run方法,此时假设需要在每次车开始跑之前做一次检查,那么一种做法时需要在BMW和Benz里分别添加检查方法,那么有没有其它方法呢?有的,就是用我们的装饰模式,该模式定义一个抽象类Decorator实现ICar接口,定义一个ICar属性,并允许通过构造函数初始化,然后定义一个抽象的run方法。竟然我们需要在车跑之前做下检查,那么我们可以再定义一个CheckDecorator装饰类,实现Decorator接口,实现run方法,在每次run之前做下检查。而对于客户端也就是类图中的DecoratorPattern,只需要实例化对应车型的实例交由CheckDecorator装饰即可,装饰类会在每次run之前做下车辆检查。

代码示例

文件结构如下:
在这里插入图片描述

代码示例如下:

public interface ICar {
    
    
    void run();
}
public class Benz implements ICar {
    
    
    @Override
    public void run() {
    
    
        System.out.println("Benz is run ...");
    }
}
public class BMW implements ICar {
    
    
    @Override
    public void run() {
    
    
        System.out.println("BMW is run ...");
    }
}
public abstract class Decorator implements ICar {
    
    

    protected ICar car;

    public Decorator(ICar car) {
    
    
        this.car = car;
    }

    public abstract void run();
}
public class CheckDecorator extends Decorator {
    
    

    public CheckDecorator(ICar car) {
    
    
        super(car);
    }

    @Override
    public void run() {
    
    
        check();
        super.car.run();
    }

    private void check(){
    
    
        System.out.println("check car ...");
    }
}
public class DecoratorPattern {
    
    
    public static void main(String[] args) {
    
    

        CheckDecorator checkDecorator = new CheckDecorator(new BMW());
        CheckDecorator checkDecorator1 = new CheckDecorator(new Benz());

        checkDecorator.run();
        checkDecorator1.run();
    }
}

运行结果如下:
在这里插入图片描述

应用场景

  • 扩展一个类的功能
  • 动态增加功能,动态撤销

优缺点

优点

装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点

多层装饰比较复杂

Guess you like

Origin blog.csdn.net/he_cha_bu/article/details/115802332