Java设计模式之装饰器模式

装饰器模式是什么

装饰器模式是指给一个类增强一些方法,对其做一些包装,但是不会影响改变原本类。

解决了什么问题:

假设有一个炸鸡接口,定义了一个制作炸鸡的方法,麦当劳和肯德基和德克士对其的制作炸鸡方法做了重写,每个厂商肯定都有自己的实现。现在假设国家规定当制作完炸鸡需要对成品做一个检查。此时我们有2个解决方案,就是直接去每个厂家制作炸鸡的方法的最后一行加上检查的逻辑,这样太过于复杂,要不就是定义N个(看有多少个厂家)子类去继承原有厂家,然后重写制作炸鸡方法,先super调用父类的实现,再自己写检查的逻辑。这样也会特别的复杂,特多的冗余代码。

所以就可以定义一个炸鸡接口的装饰类,内部维护一个炸鸡类,然后也是重写制作炸鸡方法,然后装饰类用内部维护的被装饰炸鸡类,调用制作炸鸡方法,然后把增强的逻辑加在方法后面,就可以完美的避免N个子类。

装饰器模式的案例

创建一个炸鸡接口

/**
 * @Author liha
 * @Date 2022-03-27 19:20
 * 李哈YYDS
 */
public interface FriedChicken {

    void makeFriedChicken();

}

KFC的继承炸鸡接口,重写制作炸鸡方法

public class KFC implements FriedChicken{

    @Override
    public void makeFriedChicken() {
        System.out.println("肯德基制作了一份炸鸡");
    }
}

麦当劳的继承炸鸡接口,重写制作炸鸡方法

public class McDonald implements FriedChicken{

    @Override
    public void makeFriedChicken() {
        System.out.println("麦当劳制作了一份炸鸡");
    }
}

然后定义一个炸鸡接口的装饰器类,对制作炸鸡方法进行一个加强!

/**
 * @Author liha
 * @Date 2022-03-27 19:23
 * 李哈YYDS
 */
public class FriedChickenDecorator implements FriedChicken{

    // 内部维护一个炸鸡类
    private FriedChicken friedChicken;
    
    // 通过构造方法把需要装饰的炸鸡类传进来
    public FriedChickenDecorator(FriedChicken friedChicken) {
        this.friedChicken = friedChicken;
    }

    // 增强方法
    @Override
    public void makeFriedChicken() {

        friedChicken.makeFriedChicken();
        System.out.println("检查炸鸡是否存在问题");
    }
}

测试类如下:

/**
 * @Author liha
 * @Date 2022-03-27 19:24
 * 李哈YYDS
 */
public class Test {

    public static void main(String[] args) {

        FriedChicken kfc = new KFC();
        System.out.println("没增强前:");
        kfc.makeFriedChicken();
        System.out.println("==================");

        FriedChicken mcDonald = new McDonald();
        System.out.println("没增强前:");
        mcDonald.makeFriedChicken();
        System.out.println("==================");
        
        // 把需要增强的类通过构造方法传进去
        FriedChicken kfcDecorator = new FriedChickenDecorator(kfc);
        System.out.println("增强后:");
        kfcDecorator.makeFriedChicken();
        System.out.println("==================");
        
        // 把需要增强的类通过构造方法传进去
        FriedChicken mcDonaldDecorator = new FriedChickenDecorator(mcDonald);
        System.out.println("增强后:");
        mcDonaldDecorator.makeFriedChicken();
        
    }
}

 

总结

很简单的一句总结,就是套了一层,就可以为所欲为(手动滑稽)!

优点:装饰类和被装饰类都互不受影响,不会改变原有逻辑,并且使用装饰器模式可以动态扩展功能。

缺点:如果装饰类还是一个接口,那么就可能存在多层装饰,维护起来还是比较麻烦。

与代理模式的区别:确实装饰器模式看起来跟代理模式特别的相似,但是对于代理模式来说可以作出一些操作改变原有代码,也就是说带有侵入性。而装饰器的定义是不能改变原有方法,只能对原有方法作出增强。

你可能感兴趣的:(设计模式,装饰器模式,java,后端)