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

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

初衷:

最近一直在研究设计模式,主要以专研《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()); }
}
  
 

测试结果:

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

  
 

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

文章来源: blog.csdn.net,作者:飞上天的橘子,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_43291207/article/details/116463636

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享