美文网首页
第六章 穿什么有这么重要?- 装饰模式

第六章 穿什么有这么重要?- 装饰模式

作者: amazing_s10plus | 来源:发表于2019-08-06 00:21 被阅读0次

上一章讲到小菜教会娇娇修电脑了,然后这一章就要去约会了。
那么问题来了,穿什么衣服去呢?
小菜先是简单写了一下,一个Person类,里面有wearTshirts()、wearBigTrouser()等方法,
客户端调用的时候,按不同的调用顺序可以生成不同的穿搭方式。

这时候,如果要增加一种“超人”装扮,那么就要去修改Person类,这就违反了开闭原则,继承扩展她,而不是修改她。

然后小菜又提出一种解决办法,将所有的服饰都写成子类,新增子类并不影响父类的调用。

服饰 tshirt = new TShirt();
服饰 trouser = new Trouser();
...

tshirt.show();
trouser.show();
...

这样,每个子类都要调用show方法,彷佛是在众目睽睽之下穿衣服。

小菜提出:这些步骤应该在内部组装完成,似乎是建造者模式 - build()

大鸟纠正:建造者模式要求构建的过程必须是稳定的,但此处穿衣服的内容和顺序都是不固定的。

装饰者模式 - 动态地给一个对象增加一些额外的职责,就增加子类来说,装饰模式比生成子类更为灵活

image.png
public class PersonComponent {

  private String name;

  public void show() {
    System.out.println("hahaha");
  }
}

public abstract class FineryDecorator extends PersonComponent {


  protected PersonComponent personComponent;

  public void setPersonComponent(PersonComponent personComponent) {
    this.personComponent = personComponent;
  }

  public abstract void show();
}
public class TShirt extends FineryDecorator{

  @Override
  public void show() {

    personComponent.show();
    System.out.println("TShirt...");
  }
}
public class BigTrouser extends FineryDecorator {

  @Override
  public void show() {

    personComponent.show();
    System.out.println("bigtrouser...");
  }
}
public class Test {

  public static void main(String[] args) {

    PersonComponent personComponent = new PersonComponent();

    FineryDecorator tShirt = new TShirt();
    FineryDecorator bigTrouser = new BigTrouser();

    tShirt.setPersonComponent(personComponent);
    bigTrouser.setPersonComponent(tShirt);
    bigTrouser.show();

  }
}

https://github.com/toyranger/DesignPatterns_chengjie.git

装饰模式是为已有功能动态的添加更多功能的一种方式。
什么时候使用呢?
当系统需要新功能时,如果是向类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,这种做法的问题在于,她们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。

就像一开始的Person类那样,新加入的wearX()方法,仅仅是为了满足一些只有在某种特定情况下才会执行的特殊行为的需要。
而装饰模式是把每个需要装饰的功能放在单独的类中,并让这个类包装她所需要装饰的对象,因此当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择按顺序的使用装饰功能包装对象了。

装饰模式的好处,把类中的装饰功能从类中搬移出去,这样可以简化原有的类,可以有效的把类的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。

装饰模式,简单来说,就是装饰器要装饰谁,就把谁传入自己的setComponent()中。

这一章讲的让我挺明白的。

相关文章

  • 第六章 穿什么有这么重要?- 装饰模式

    上一章讲到小菜教会娇娇修电脑了,然后这一章就要去约会了。那么问题来了,穿什么衣服去呢?小菜先是简单写了一下,一个P...

  • 大话设计模式读书笔记-6装饰模式

    第6章 穿什么有这么重要?——装饰模式 定义与功能 为已有类动态添加功能。简化主类,使主类只具有核心功能,将装饰性...

  • 第6章 穿什么有这么重要?--装饰模式

    情境 要求写一个可以给人搭配不同服饰的系统,比如类似QQ、网络游戏或论坛都有的Avatar系统。 常规做法 UML...

  • 如何利用装饰者模式在不改变原有对象的基础上扩展功能

    目录 什么是装饰者模式 普通示例 装饰者模式示例 类图关系 装饰者模式使用场景 装饰者模式优点 装饰者模式缺点 什...

  • 设计模式の装饰器模式

    在前面相信大家对组合模式已经有了一定的了解,现在我们来继续讲一下装饰器模式。 什么是装饰器模式 装饰模式是通过组合...

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • 装饰模式(Decrator)

    一、 什么是装饰模式 装饰模式又名包装模式(Wrapper)。装饰模式是以对客户端透明的方式扩展对象的功能,是继承...

  • 1.装饰器模式

    装饰器模式 什么是装饰器模式? 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,...

  • PHP的设计模式-装饰者模式

    装饰者模式 装饰者模式 装饰者模式类似蛋糕,有草莓味、奶酪等种类,但是它们的核心都是蛋糕。 不断地将对象添加装饰的...

  • 设计模式-装饰者模式

    什么是装饰者模式?什么时候用? 装饰者模式,可以动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生...

网友评论

      本文标题:第六章 穿什么有这么重要?- 装饰模式

      本文链接:https://www.haomeiwen.com/subject/fgavdctx.html