装饰者模式

装饰者模式解析
本文通过一个生动的例子介绍了装饰者模式的使用场景及其实现方法。文章以一个Woman对象为基础,展示了如何通过装饰者模式来避免类的继承带来的复杂性和代码重复问题。

装饰者模式

为什么会有?
说明之前我们先来举一个例子.
首先我们有一个Woman对象,他分别有颜值,智商两个属性和一个说话的方法.
然后我们依次需要 化过妆的woman. 高学历的woman.和有礼貌的woman.
化过妆的 woman颜值会变高;
高学历的woman智商会变高;
有礼貌的woman说话时会变的有礼貌;
怎么得到这三个对象呢?
显然需要通过继承woman这个父对象来实现;
将三个对象分别继承 woman,并重写其getBeauy()方法,getIq()方法,和say()方法;
这显然很容易实现;
但是问题来了, 化过妆的woman. 高学历的woman.和有礼貌的woman.并不是独立存在的,
什么意思呢?
    我们可能也会需要即化过妆,有高学历的woman,或者 化过妆的 有礼貌的woman,或者 高学历的 有礼貌的 woman,又或者 化过妆的高学历的有礼貌的woman.
    这时候我们要怎么办呢?
有人可能会说了,我创建一个woman让他继承化过妆的woman,在重写他的 getIq()方法让他的智商也变高,就得到了 化过妆,有高学历的woman,再创建一个woman 去继承高学历的 woman, 在重写他的say ()方法让他变得有礼貌,就得到了高学历有礼貌的 woman.    依次类推就可以得到所有的woman了.
    我先不说这个方法究竟有多麻烦,我们先看看他的代码重复的问题就是我们无法忍受的.
   我们再得到化过妆,有高学历的woman的时候,有两种方法,一种是继承化过妆的woman,在重写他的getIq()方法让他的智商也变高,但是重写 getIq()方法我们在得到高学历的woman时已经做过了再次做显而易见会形成重复代码 ;还有一种是 继承 高学历的woman,重写他的 getBeauy()方法,同理 getBeauy()方法在 得到 化过妆的woman的时候也已经重写过了.
    我们再来看他的复杂程度,先不说三种基础的,只看  掌握 2 种以上的woman 都有3种,每种有两种不同的继承方法,
掌握3 种的技能的woman有一种,有3中继承方法,这只是3个属性或方法的情况,就衍生出7种的不同的woman类,如果有4个属性呢?5个属性呢?实际情况是会生成一套极其复杂的继承体系.但是这并不是我们想要的.
    我们又该如何解决这个问题呢?
    这就用到了我们的装饰者模式!
      /***
     * 装饰者模式的核心内容
     * WapperWoman持有被装饰者 Woman的类对象;
     * 通过这种方法,可以将包装过的类对象作为参数传给下一个包装类进行再次包装.
     * 通过这种方法实现对某个类进行多次包装.
     */
    具体代码如下:

   
  1. public abstract class WapperWoman extends Woman {
  2. /***
  3. * 装饰者模式的核心内容
  4. * WapperWoman持有被装饰者 Woman的类对象;
  5. * 通过这种方法,可以将包装过的类对象作为参数传给下一个包装类进行再次包装.
  6. * 通过这种方法实现对某个类进行多次包装.
  7. */
  8. private Woman woman;
  9. public WapperWoman(Woman woman) {
  10. super(woman.getName(), woman.getBeauty(), woman.getIq());
  11. this.woman = woman;
  12. }
  13. @Override
  14. public String getName() {
  15. return woman.getName();
  16. }
  17. public int getBeauty() {
  18. return woman.getBeauty();
  19. }
  20. public int getIq() {
  21. return woman.getIq();
  22. }
  23. public void say(){
  24. System.out.println("我叫"+woman.getName());
  25. }
  26. }
    然后,我们的会化妆的woman、 高学历的woman.和有礼貌的woman.再去继承WapperWoman这个包装类,分别重写他的 getBeauy()方法,getIq()方法,和say()方法.
    如果我们需要 会化妆 高学历的woman时只需要

   
  1. Woman woman = new DressedWoman(new EducatedWoman);
就得到了 化妆 高学历的woman;
怎么样?是不是很方便呢?这就是装饰者模式的核心内容.请仔细体会.










转载于:https://www.cnblogs.com/Jxiaobai/p/6617498.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值