栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java设计模式之装饰器模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java设计模式之装饰器模式

装饰器模式是什么

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

解决了什么问题:

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

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

装饰器模式的案例

创建一个炸鸡接口

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("麦当劳制作了一份炸鸡");
    }
}

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

public class FriedChickenDecorator implements FriedChicken{

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

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

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

测试类如下:

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();
        
    }
}

 

总结

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

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/781690.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号