您的位置:首页 > 其它

装饰设计模式理论+推测

2017-10-18 21:09 666 查看
什么是装饰设计模式,套用老师的一句话:在原有的基础上,添加新的东西,形成新的产品,当时老师举了个例子,做了抽象类:奶茶,定制了名字和价格.

然后由原味奶茶继承与抽象且重写,原味奶茶价格5元,名字:奶茶,又做了几个类,分别是红豆,椰果,珍珠,他们都是一样的,继承抽象类,这几个类有构造器,参数是抽象类,奶茶,把这个抽象类的价格和名字赋给在外面申请好的价格和名字。

然后重写的方法:名字和价格,就是自己的价格+传进来的奶茶价格,自己的名字+传进来的奶茶名字。在使用的时候,抽象类不能实例化,如下:Naicha a=new Hongdou(new Yuanwei());,调用方法打印的结果是:红豆奶茶,价格6.

也可以写:Naicha a=new Hongdou(new Zhenzhu(new Yeguo(new Yuanwei)));结果即是:红豆珍珠椰果奶茶,价格:9,你的疑惑可能是为什么会这种写法?且打印这种结果?

是这样子滴,先解释为啥有这种写法,首先,Hongdong是有一个构造器,参数是奶茶抽象类,传入下面的子类即可,我们先传入的是(new Zhenzhu()),然后呢,在Yeguo也是有构造器的,传入原味,原味没有写构造器,默认是空构造器,结束。

然后,new对象就是从Yuanwei开始,空的没啥好说,然后往外走是Yeguo,传入参数是Yuanwei(),把Yuan味的Mingzi和Jiage传入到Yeguo申请的Jiage和Mingzi,然后再往外就是Zhenzhu,传入的参数即是Yeguo,

在构造器方法上接收的写法即使,Naicha a=new Yeguo();。然后用a把Yeguo的名字和价格赋值到Zhenzhu,刚刚Yeguo的名字和价格经过原味参数一赋值已经变成,奶茶和5元,把这个Mingzi和价格又给了Zhenzhu类申请在外面的Mingzi和Jiage,

为什么变成奶茶和5元了?因为在椰果构造器的时候得到了原味奶茶对象,然后调用了原味奶茶对象的Mingzi和Jiage,之前说了原味奶茶的价格是5,名字奶茶。

Zhenzhu的Mingzi和Jiage已经变成:椰果奶茶和6元,再往外是Hongdou也是一样,收到Yeguo对象,拿值着往自己申请在外面的赋值,结果:珍珠椰果奶茶,6元

你可能会问,刚刚珍珠的名字和价格是:椰果奶茶和6元,怎么到了红豆这里就是珍珠椰果奶茶,8元了?为什么刚刚不刷新?因为在珍珠那里他只是把椰果奶茶的东西赋值进来,到了红豆这里,构造器调用了珍珠的Mingzi()和Jiage()

红豆的Mingzi()和Jiage写了什么呢?其实也就是这几种派生类,红豆椰果珍珠都有写的,那写的什么呢?在这些派生中名字和价格写的是:return 自身名字+Mingzi属性,return 自身价格+价格属性,什么意思呢?

在Hongdou构造器调用Zhenzhu发生了这些操作,拿到自己的名字属性和价格属性,也就是拿到Zhenzhu之前从Yeguo哪里获得的:椰果奶茶和6元,然后,自身的名字,设定的是:珍珠:自身的价格设定的2元。一加上就是:珍珠椰果奶茶,8元。

返回给Hongdou,也就是拼接好的:红豆椰果奶茶,8元,返回到函数调用点,getMingzi(),getJiage();然后构造器执行完毕,Hongdou的Mingzi即是:珍珠椰果奶茶,价格8元。

最后在调用getMingzi(),和getJiage,得到的即是红豆珍珠椰果奶茶,价格9元。什么叫做装饰设计模式?奶茶是一个抽象类,原味奶茶是一个继承抽象类的类,我们以此位为基类,然后加入新的东西,发展派生出新的产品,这就是装饰设计模式。

在通过奶茶例题,融汇一下,奶茶是抽象的,用作定制方法,拿着一个类进行继承重写,这个类中所实现的是一个奶茶基本该有的,比如原味奶茶,价格5元,然后加不同的东西做出不同的产品,以什么为基类自己定。

添加新东西,为什么不在基类中操作?而是又做操作类?为了更好的发展,回到面向对象高级部分,抽象类和接口一样,是为了派生扩展灵活,你不会知道有多少种奶茶,你不会知道奶茶有多少种对属性操作的方法。

所以你定制抽象类,是为了以后添加更多种对属性操作的方法,为什么不定制属性?我也在思考,我想即便是抽象的奶茶概念也应该有抽象的属性,实际操作中在一一实现,接口更是静态常量,我也要开始思考这么一点了。回到刚才的问题。

抽象类中定义了对属性操作的方法,各种各样的奶茶重写且对奶茶属性操作,但他们都需要基类,就像调制奶茶是在基本的奶茶,什么都没有开始加东西,形成新产品。这些奶茶也是如此,他们需要一个基类所以原味奶茶出现了。什么都没有。

因为你什么都没有,所以你什么都不用加,直接返回价格和名字即可,这种基类就适合派生,做红豆奶茶,那你得给我一杯奶茶,所以构造器就要求奶茶做为参数。

然后并不是马上就开始做了,而是拿出你这操作类里面的属性,为什么?我需要往原味奶茶添加红豆,形成红豆奶茶,你这杯原味奶茶,名字奶茶,价格5元,我就要把我红豆往里面添加,我就要把我红豆价格往里面添加,都是对属性的操作。

怎么操作呢?通过方法来操作,所以每个类都有Mingzi()和Jiage(),操作完毕后,你就可用进行返回了,把结果返回,我觉得这里老师是偷了懒的,getMingzi()和gatJiage

直接就拼接且返回,你拼接了之后,应该刷新一个价格和名字,通过get方法获得,不过这样调用拼接就不能这样做,这个getMingzi和getJiage有点不妥。

所以你看到new过来,new过去其实都一样,为什么构造器参数要是抽象类奶茶?因为这样,你才能传入不同的奶茶进去,做出结合产品奶茶,如红豆椰果珍珠奶茶,是结合产品,如果不是抽象类,传入什么?死的参数传入固定的死值。

这就是装饰设计模式,以一个为基类进行派生,以什么都可以。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: