装饰者模式

装饰者模式

为什么会有?

说明之前我们先来举一个例子.
首先我们有一个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