zoukankan      html  css  js  c++  java
  • 装饰者模式

    装饰者模式

    为什么会有?

    说明之前我们先来举一个例子.
    首先我们有一个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;
    怎么样?是不是很方便呢?这就是装饰者模式的核心内容.请仔细体会.










  • 相关阅读:
    android29
    android28
    android27
    android26
    Dynamics CRM2011 MspInstallAction failed when installing an Update Rollup
    Dynamics CRM Import Solution Attribute Display Name description is null or empty
    The service cannot be activated because it does not support ASP.NET compatibility
    IIS部署WCF报 无法读取配置节“protocolMapping”,因为它缺少节声明
    Unable to access the IIS metabase.You do not have sufficient privilege
    LM算法与非线性最小二乘问题
  • 原文地址:https://www.cnblogs.com/Jxiaobai/p/6617498.html
Copyright © 2011-2022 走看看