• 欢迎光临~

Datawhale组队学习——大话设计模式Task02学习笔记

开发技术 开发技术 2022-12-16 次浏览

Task02:策略、装饰、代理

个人抽象理解:

  • 策略:灵活多变的算法实现规则
  • 装饰:把类的核心职责和装饰功能区分开了,去除相关类中重复的装饰逻辑;把类中的装饰功能从类中搬移去除,简化了原有的类;
  • 代理:不便直接访问,创造一个“中间代理”

策略模式

例子

实现一个商场收银软件程序,营业员可以通过输入客户所有购买商品的单价和数量,程序自动计算出总金额。

结构组成

策略模式由三类主要角色组成:

  • 策略类:定义所有支持算法的公共接口,在这个例子中具体为收费抽象类;
  • 具体策略类:具体的算法,在这个例子中具体为各类收费类和折扣优惠收费类;
  • 上下文类:维护对策略对象的应用。

适用场景

一个系统中有多个算法和类很相似,区分这些类和算法的只是其内部行为

实际应用

在导航应用中,有不同的路径规划算法,如针对步行的、骑行的、搭乘公共交通工具的、以及开车的等。主要导航类的主要工作是在地图上渲染出规划好的路径,并不会在意是由和算法生成的路径。此时可以将路径规划算法使用策略模式进行封装,方便与主要导航类的交互。

优点缺点

优点:

  • 可以以相同的方式调用所有算法,减少了各种算法类与使用算法类之间的耦合。策略模式的Strategy类层次为Context类定义了一系列的可供重复使用的算法或行为,继承有助于析取这些算法中的公共功能。
  • 简化了单元测试。每个算法都有自己的类,可以通过自己的接口单独测试;
  • 符合“开放封闭原则”,无需对上下文进行修改就可以引入新的策略。

缺点:

  • 不适合算法极少发生改变的场景,会使得程序整体过于复杂;
  • 要求客户端必须知晓策略间的不同,因为需要从中选择;

装饰模式

何时用?

需要将所需功能按正确的顺序串联起来进行控制,此时可以考虑使用装饰模式

例子

使用程序写一个可以给人搭配不同服饰的系统

结构组成

装饰模式由四类主要角色组成:

  • 实体接口:对象接口的定义,可以为对象动态添加职责,在这个例子中职责具体为形象展示的过程,由于Person类在此程序中只有形象展示这一个职责,Person类既是访问接口,也是实体类;
  • 实体类:在这个例子中具体为Person类;
  • 装饰抽象类:继承实体接口,动态扩展其职责,在这个例子中具体为服饰抽象类;
  • 具体装饰类:装饰的具体实现,在这个例子中具体为各类服饰类,如大T恤,大垮裤等。

适用场景

可以在不生成很多子类的情况下扩展类,适用于扩展类需求较多,而又不想引起子类膨胀的场景。

实际应用

通知信息有多种渠道,如通过短信、微信、QQ、邮件等。不同的信息会采用不同的多种渠道组合进行通知,此时若对每一个组合都建立子类,会造成子类数量爆炸,可以考虑装饰器模式。

优点缺点

优点:

  • 把类中的装饰功能从类中搬移去除,很好地简化了原有的类;
  • 有效地把类的核心职责和装饰功能区分开了,可以去除相关类中重复的装饰逻辑;
  • 装饰类和被装饰类可以独立发展,不会相互耦合;
  • 无需创建新子类即可实现对类功能的动态扩展;
  • 支持运行时添加或删除对象的功能;
  • 满足“单一职责原则”,可将实现许多不同行为的类拆分为多个较小的类。

缺点:

  • 在封装器栈中删除特定封装器比较困难;
  • 较难实现行为不受到先后顺序影响的装饰;
  • 各装饰层的代码相对冗余。

代理模式

定义:代理模式(Proxy Pattern)是指实现一个类代表另一个类的功能,为其他对象提供一种代理以控制对这个对象的访问。

何时用?

  • 本地执行远程服务(远程代理):适用于服务对象位于远程服务器上的情形,可以为一个对象在不同的地址空间提供局部代表。
  • 延迟初始化(虚拟代理):如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时,可使用代理模式。
  • 访问控制(保护代理/安全代理):如果只希望特定客户端使用服务对象,对象可以是操作系统中的重要部分,而客户端则是各种已启动程序,可使用代理模式。
  • 记录日志请求(日志记录代理):适用于需要保存对于服务对象的请求历史记录时。
  • 缓存请求结果(缓存代理):适用于需要缓存客户请求结果并对缓存生命周期进行管理时,特别是返回结果体积非常大时。
  • 智能指引:调用真实对象时,代理处理另外一些事,可在没有客户端使用某个重量级对象时,立刻销毁该对象。

例子

卓贾易委托戴励追求娇娇

结构组成

代理模式由三类主要角色组成:

  • 访问接口:在这个例子中具体为送礼物的行为;
  • 实体类:在这个例子中具体为追求者;
  • 替代实体的代理类:在这个例子中具体为代理。

适用场景

不方便直接访问对象时,为不宜直接访问的对象提供一个访问层。

实际应用

  • 信用卡是银行账户的代理,而银行账户则是一大捆现金的代理。它们都可以实现相同的支付功能。
  • windows里的快捷方式。
  • 客户端对数据库的查询有时要消耗大量系统资源,常在有需要时才创建(延迟初始化),这会带来代码的大量重复。可以创建代理,让代理伪装成数据库对象,在客户端或实际数据库对象不知情的情况下处理延迟初始化和缓存查询结果的工作。

优点缺点

优点:

  • 引入代理后,职责清晰;
  • 引入代理后,可扩展多种用途,如:
    ① 远程代理可以隐藏一个对象存在于不同地址空间的事实。
    ② 虚拟代理可以存放实例化时间很长的真实对象。
  • 符合“开放封闭原则”,无需对上下文进行修改就可以引入新的策略。

缺点:

  • 代码可能变得复杂,因为需要新建许多类;
  • 服务响应可能会延迟。

Sweetalk Design Pattern

程序员灯塔
转载请注明原文链接:Datawhale组队学习——大话设计模式Task02学习笔记
喜欢 (0)