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;
    怎么样?是不是很方便呢?这就是装饰者模式的核心内容.请仔细体会.










  • 相关阅读:
    mysql的sql执行计划
    JMX
    用 Cobertura 测量测试覆盖率
    javap反汇编的使用
    Java ASM 技术简介
    基于Java Instrument的Agent实现
    浮动的同级盒子顶对齐
    子绝父相布局
    相对定位,绝对定位和固定定位
    嵌套的定位盒子如何居中?
  • 原文地址:https://www.cnblogs.com/Jxiaobai/p/6617498.html
Copyright © 2011-2022 走看看