常人能看懂的设计模式(三)装饰者模式

初衷:

最近一直在研究设计模式,主要以专研《Head First设计模式》以及看网上各路大神的见解。这边想用自己对于23种设计模式的理解,用一种非程序员都能理解的方式去介绍设计模式,毕竟我觉得设计模式是一种很好的处理问题的思想方法,不应该仅限于代码的实现。希望能够对于刚接触设计模式的小伙伴们有所帮助。当然有不对的地方,欢迎下方留言。一定及时修改。

装饰者模式实现:

让我们一起动动脑瓜子,一起想想下面这些问题。

1、什么是装饰?
在这里插入图片描述
其实,今天这个模式不难,只要我们从心出发,也就是从常识出发,会发现它很简单。
那什么是装饰呢?
装饰不就是在一个原有事物的基础上加点东西,需要注意的就是加完之后事物还是那种事物。
可能有点绕。举个例子:
原先一个原味红茶,加了牛奶,变成了奶茶。奶茶还是一种茶吧。

2、什么是装饰者?
在这里插入图片描述
明白了什么是装饰,那我们来说说装饰者。什么是装饰者?
你家里需要装修,装饰者是谁?当然是装修师傅了。
连接上面奶茶的例子。其中的装饰者,应该是给红茶加牛奶的服务员。对吧!

3、装饰者干了什么?
在这里插入图片描述
那请问目前来看这个服务员的工作是什么?
给奶茶加牛奶对吗?????
对了一半!
正确的应该是给茶加牛奶。
难道我给服务员一杯加过牛奶的奶茶再加牛奶不行吗?当然是可以的。只要给她的是茶。不管什么茶都行。

4、什么是装饰者模式?
这里的话,我们先假设我们经营了一家奶茶店。里面呢有三个奶茶妹妹作为服务员。
在这里插入图片描述
最开始呢,店了客人不多。间断性的来一两个客人。这个时候需要做什么,一个奶茶妹妹负责从头到尾一杯做完。
比如:
一号顾客要了:红茶+牛奶+糖+珍珠。一号奶茶妹妹去做。
二号顾客要了:绿茶+牛奶+糖。二号奶茶妹妹去做。
三号顾客要了:红茶+牛奶+牛奶+珍珠。三号奶茶妹妹去做。
似乎还应付的过来。
但是慢慢的生意变好了。一天到了下班点。店里突然来了20几个人买奶茶。我们还是让奶茶妹妹一个人做一杯吗?这样其实很慢!!!那奶茶店是怎么增加速度和效率的呢?这时候就要看大家在生活中细不细心了。奶茶店里其实都是分工合作的。每个人只需要干自己的那个事就好了。不信可以选个高峰期去奶茶店看看。他们的将装饰者模式应用的很不错哦。具体怎么实现呢?
看例子:
一号顾客要了:红茶+牛奶+糖+珍珠。
一号奶茶妹妹往茶里加牛奶,
二号奶茶妹妹往茶里加糖,
三号奶茶妹妹往茶里加珍珠。

二号顾客要了:绿茶+牛奶+糖。
一号奶茶妹妹往茶里加牛奶。
二号奶茶妹妹往茶里加糖,

三号顾客要了:红茶+牛奶+牛奶+珍珠。
一号奶茶妹妹往茶里加牛奶,
一号奶茶妹妹往茶里加牛奶,
三号奶茶妹妹往茶里加珍珠。

。。。。
就算有更多的订单,每个奶茶妹妹都不需要考虑这杯要加什么,只需要把拿到收到奶茶里加入她该加的东西就可以了。这样是不是方便了很多。

初步总结

经过上诉的例子,相信大家都应该能够明白什么是装饰者模式了吧。每个奶茶妹妹都是一个装饰者。她们的工作就是拿到茶,往茶里加东西。注意的就是加完东西那杯茶还是茶。给到别的奶茶妹妹手里,她们还能继续加东西。

=接下来是程序猿时间=

接下来让我们用代码来实现以下装饰者模式吧!
首先最核心的还是那句话,让我们再看一遍:每个奶茶妹妹都是一个装饰者。她们的工作就是拿到茶,往茶里加东西。注意的就是加完东西那杯茶还是茶。给到别的奶茶妹妹手里,她们还能继续加东西。
这里我们可以提取出几个关键点:
1、有一个抽象类,代表茶。
2、应该有类继承茶,比如红茶,绿茶
3、奶茶妹妹拿到手的是一种茶,可以是红茶,可以是绿茶,也可以是奶茶。
4、奶茶妹妹田添加完东西后的东东还是继承茶!!!这点很关键。

开始写代码:
1、定义一个抽象类Tea

public abstract class Tea {
    String name ="茶";
    abstract String getName();
}

2、定义实体类,红茶,

public class RedTea extends Tea{
    String name = "红茶";
    @Override
    String getName() {
        return name;
    }
}

3、定义奶茶妹妹这个工作员工的抽象类 Decorator 。规定了奶茶妹妹生成的是奶茶而不是面包。
要点再强调一遍:奶茶妹妹生成的也是茶。

//生成的也会是茶
public abstract class Decorator extends Tea{
    String work;
    abstract String getName();
}

4、定义我们的奶茶妹妹(装饰者)。
要点再强调一遍:奶茶妹妹需要拿到茶,生成的也是茶。

//生成的也会是茶
public class TeaAddMilk extends Decorator{
    //拿到的是茶
    Tea tea;
    public TeaAddMilk(Tea tea) {
        this.tea = tea;
    }
    
    String work="加牛奶";
    @Override
    String getName() {
        return tea.getName()+work;
    }
}

这里我就不定义别的奶茶妹妹了,你们有性趣可以再加几个试试。

5、编写test类,测试结果

public class test {
    public static void main(String[] args) {
        //没装饰
        RedTea redTea = new RedTea();
        System.out.println(redTea.getName());
        //加一次牛奶
        TeaAddMilk teaAddMilk =new TeaAddMilk(redTea);
        //加两次牛奶
        TeaAddMilk teaAddMilk1 =new TeaAddMilk(teaAddMilk);
        //加三次牛奶
        TeaAddMilk teaAddMilk2 =new TeaAddMilk(teaAddMilk1);
        System.out.println(teaAddMilk.getName());
        System.out.println(teaAddMilk1.getName());
        System.out.println(teaAddMilk2.getName());
    }
}

测试结果:

红茶
红茶加牛奶
红茶加牛奶加牛奶
红茶加牛奶加牛奶加牛奶

可以看到结果应该跟我们设想的一样。是不是很简单。核心还是那句话,再强调三遍:
每个奶茶妹妹都是一个装饰者。她们的工作就是拿到茶,往茶里加东西。注意的就是加完东西那杯茶还是茶。给到别的奶茶妹妹手里,她们还能继续加东西。
每个奶茶妹妹都是一个装饰者。她们的工作就是拿到茶,往茶里加东西。注意的就是加完东西那杯茶还是茶。给到别的奶茶妹妹手里,她们还能继续加东西。
每个奶茶妹妹都是一个装饰者。她们的工作就是拿到茶,往茶里加东西。注意的就是加完东西那杯茶还是茶。给到别的奶茶妹妹手里,她们还能继续加东西。
在这里插入图片描述
加油兄弟们!路漫漫其修远兮,吾将上下而求索。
最后补上一张类图
在这里插入图片描述
有什么建议,或者更好的领悟,欢迎下方留言。要是觉得有帮助记得一键三连哦!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值