程序员:我终于知道啥是装饰者模式了

作者:千珏
邮箱:[email protected]
公众号:千珏
标题:设计模式之装饰者模式(转载请标明出处)

Hello,各位观众老爷们,这期讲的是与Java IO类有着很深羁绊的装饰者模式。

首先我们看下装饰者模式的定义。

定义

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

看到这个定义我们大概可以知道装饰者模式的三个特点

  1. 不改变原类
  2. 不使用继承
  3. 动态扩展

有可能,观众老爷们看到这里还有些懵,这些特点都是啥意思呀,不急,看完千珏下面的例子你们就知道他们是什么意思了。

例子

比如千珏开了一家装修公司叫千珏装修,近几年得益于房地产的高速发展,千珏装修也高速的发展了起来,本来公司业务只能装公司原有的三个定好的款式,家具都是固定的,现在由于来找公司装修的人越来越多了,有很多人想要自定义买家具,想让千珏装修支持自定义买家具,然后千珏装修就要合理考虑他们的要求,扩展样式,于是产品结构就发生了改变,本来结构如下:
image.png

后面也许会变成这样子
image.png

看到这个图就要觉得类爆炸了,这样设计下去肯定不好管理,那怎么办呢。

这个时候千珏装修公司里面有一个员工站了起来,说我们可以把那些装修里面的家具材料都放到Decoration接口里面,别的款式只要合理的引用就可以了,就像下面这张图一样。
image.png

比如客户如果要桌子的话我们就setDesk()就好了,最终在price()方法里面计算他的总价格。

这个时候员工B站了起来,说你样不对啊,如果客户想要别的东西呢,你还不是要扩展类吗。

员工A:不用扩展啊,我直接在类里面加引用就好了呀,修改一下原本的类。
员工B:那你不这不就违反了开闭原则
员工A:这是啥东西。
员工B:开闭原则就是类应该对修改关闭,对扩展开放,你这样做的话不就是违反了这个原则了吗
员工A:那你说怎么办。
员工B:这个时候就应该用到了装饰者模式,现在让我来和你们说一下什么装饰者吧。

我们以一个客户的需求来说吧,我的一个客户想要他的家里面有一个桌子,一个椅子,一张床。

  1. 首先以一个北欧装修风格来说,我们先拿到的是北欧装修风格的对象
  2. 用一张桌子来装饰北欧装修风格
  3. 用一张椅子来装饰北欧装修风格
  4. 用一张床来装饰北欧装修风格
  5. 最后计算价钱,让顾客付款。

类设计成下面的样子
首先是装修公司接口

public interface Decoration {
    String getDescription();
    double price();
}

然后是家具接口

public interface Furniture extends Decoration {
    
}

下面是北欧装修风格类

public class BeiouDecoration implements Decoration {
    String description = "北欧装修风格";
    @Override
    public String getDescription() {
        return description ;
    }

    @Override
    public double price() {
        return 5000;
    }
}

下面是具体的家具类

public class Chair implements Furniture {
    String description = "椅子";
    Decoration decoration;
    public Chair(Decoration decoration){
        this.decoration = decoration;
    }
    @Override
    public String getDescription() {
        return decoration.getDescription() + "," + description;
    }

    @Override
    public double price() {
        return decoration.price() + 50;
    }
}

public class Desk implements Furniture {
    String description = "桌子";
    Decoration decoration;
    public Desk(Decoration decoration){
        this.decoration = decoration;
    }
    @Override
    public String getDescription() {
        return decoration.getDescription() + "," + description;
    }

    @Override
    public double price() {
        return decoration.price() + 100;
    }
}

public class Bed implements Furniture {
    String description = "床";
    Decoration decoration;
    public Bed(Decoration decoration){
        this.decoration = decoration;
    }
    @Override
    public String getDescription() {
        return decoration.getDescription() + "," + description;
    }

    @Override
    public double price() {
        return decoration.price() + 2000;
    }
}

下面我们就按照这个用户的要求写个测试类,看看他最终的价格和最终的配置。

public class TestDecoration {
    public static void main(String []args){
        //首先是拿到北欧的装修风格的对象
        Decoration decoration = new BeiouDecoration();
        //然后放张桌子
        decoration = new Desk(decoration);
        //放张椅子
        decoration = new Chair(decoration);
        //放张桌子
        decoration = new Bed(decoration);
        //看下最终的配置和价格
        System.out.println("装修配置为:" + decoration.getDescription() + "\n价格为:" + decoration.price());
    }
}

程序输出为

装修配置为:北欧装修风格,桌子,椅子,床
价格为:7150.0

上面就是大概的装饰者模式了,不知道各位看官老爷们看懂了吗,没看懂的看官老爷们,建议多看几遍嗷.

总结

装饰者模式是一个很强大的模式,各位观众老爷们看Java IO源码的时候就会看到装饰者模式的强大了。

由于篇幅有限,这里就不扯java io了,闲余时间观众老爷们可以看一看。

下一期预告 外观模式。

如果觉得千珏写的好的话可以关注下呀。

猜你喜欢

转载自blog.csdn.net/zjwl199802/article/details/107515905
今日推荐