首先看Strategy和Decorator在GoF的《Design Patterns》的intent

Decorator

(1)intent:

Attach additional responsibilities to an object dynamically.Decorators provide a flexible alternative to subclassing for extending functionality.

(2)UML Diagram:

Strategy

(1)intent

Define a family of algorithms,encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary indepedently from clients that use it.

(2)UML diagram:

(CHYGO)问:如果把Decarator中的Additional responsibilities看成是a family of algorithms,那么Strategy和Decorator不都是一样的么?两种Patterns有什么异同?

(CHYGO)答:

(1)按蜡笔先生提供的思路,首先从两种模式的所属的Purpose下手:

Decorator属于Structural Patterns;Stratery属于Behavioral Patterns.那么两种Purpose(或者说3种Purpose的区别是什么?)

a.来自《设计模式解析》

创建型  意图:创建或实例化对象   用途:实例化对象

结构性  意图:将已有的对象组合起来   用途:处理结构,将实现与抽象联系起来

行为型  意图:给出一种提供灵活(变化)行为的方式  用途:封装变化

b.来自GoF的《Design Patterns》

Creational:the process of object creation

Structural:the composition od classes or objects

Behavioral:characterize the way in which classes or objects interact and distribute responsibility

可注意到Structural的特征是“对象的组合”;而Behavioral的特性是:提供灵活的行为方式。关键的区别点在于是否涉及到对象的组合。于是再往下分析,Strategy是把Class Stratefy聚集到Class Content中,由Content调用Strategy的AlgorithmInterface(),所以可以推知Strategy属于对象的组合。wow,Hold on~GoF是把Strategy归为Behavioral一类的,很明显不可能是他们错了。我觉得应该这么分析,Strategy这个类封装了算法的变化,然后content中不能显式的看到这种变化,所以Stategy为Behavioral Pattern?这样分析是否正确?如果学习到接下来的Behavioral Pattern我会验证的。

那Decorator呢,关注主要的类Decorator(我的理解是看purpose主要看主要功能类的地位,在Decorator中主要功能类就是Decorator)。由UML Diagram可见,Component是Class Decorator的父类,Class Decorator在派生各种不同的Decorator功能。这好像就是“类爆炸”啊?

注意,Class Decorator的父类Component又聚集到了Class Decorator中。也就是说用同样派生自component的Class ConcreteComponent和Class Decorator(Decorator的子类)进行组合,所以是Structural Pattern?(这样的分析是否正确待以后验证)

在看两种模式的main()代码:

Strategy

int main(int argc,char* argv[])
{ Strategy* ps = new ConcreteStrategyA();Context* pc = new Context(ps);pc->DoAction();if (NULL != pc) delete pc;return 0;
}

Decorator

int main(int argc,char* argv[])
{ Component* com = new ConcreteComponent();Decorator* dec = new ConcreteDecorator(com);dec->Operation();delete dec;return 0;
}

咋一看上去好像两者的main()代码都是一样的(Decorator指向的是子类对象,而Context指向的是自身的对象,这是唯一的不同)。两段代码关键就在于Strategy和Context是纯粹的聚合关系。而Component和Decorator是派生+聚合关系;

本人愚钝,对Design Patterns还没有很好的理解。嗯嗯,继续努力。

转载于:https://www.cnblogs.com/CHYGO/articles/1905176.html

Distinction Between Strategy and Decorator相关推荐

  1. 如何应用设计模式设计你的足球引擎

    blog原文地址http://blog.csdn.net/lanphaday/archive/2008/09/11/2915518.aspx 如何应用设计模式设计你的足球引擎(第一.二部分)te> ...

  2. 基于ASP.NET MVC框架开发Web论坛应用程序

    我想通过本系列文章从头到尾构建一个完整的ASP.NET MVC论坛应用程序,最终的目的是探讨和推动使用ASP.NET MVC框架构建应用程序的最佳实践. 1. 简介 在本篇中,我想先从全局方面介绍一下 ...

  3. Python 学习线路图,码住!

    译者 | 弯月 出品 | CSDN(ID:CSDNnews) 以下为译文: 最近,有人在推特上发布了一份 Python 学习线路图,其中包含三个部分. 虽然我不确定这份列表是否完整,分组是否合理,但我 ...

  4. 2022 综合英语慕课(大学英语二)最新满分章节测试答案(题库中自找具体题目)

    Unit 1 Ethnic Identity 种族认同 Unit 1 单元测试 小提示:本节包含奇怪的同名章节内容 1. 问题:The desire for peace                 ...

  5. linux内核中的设计模式

    创建型     Object Pool   Object Pool模式可以提升性能,尤其是在对象的分配.初始化成本高,使用频率高 但使用时间短的情况下.对象池可以设置对象池的大小和回收时间缓存预分配的 ...

  6. 如何应用设计模式设计你的足球引擎(第一、二部分)

    原文地址: http://www.codeproject.com/KB/architecture/applyingpatterns.aspx 作者:An 'OOP' Madhusudanan 译者:赖 ...

  7. 设计模式之策略模式(Strategy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 设计模式之装饰模式(Decorator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. Strategy模式

    一.从订餐开始<?XML:NAMESPACE PREFIX = O /> 小王和小刘两人到餐厅点餐,两人分别如下告诉厨师. 小王:我要一杯加了香草冰淇淋的巧克力汽水. 小刘:一个黑与白. ...

最新文章

  1. aba会导致问题_为什么说第三方仓储企业再专业也会导致很多库存问题呢?
  2. boost::johnson_all_pairs_shortest_paths用法的测试程序
  3. 服务器系统的安装方法,服务器的操作系统安装方法
  4. Linux基础知识题解答(四)
  5. Spark SQL External DataSource外部数据源
  6. 路径的形式不合法解决方案
  7. 关于DHCP的中继问题
  8. 第五章 循环结构课后思考
  9. 原生JS实现HTML文件上传,简单实现js上传文件功能
  10. 施耐德PLC Unity Pro xl 软件使用一
  11. 齐治运维堡垒机后台命令执行漏洞
  12. 淘宝无人直播赚钱模式
  13. java实现计算器算法_怎样用java 实现计算器的 算法
  14. JS格式化输出常用格式
  15. 重磅!全球前2%顶尖科学家榜单发布!
  16. ubuntu双系统引导梅花_Win10+ubuntu 双系统安装顺顺利利!
  17. 格鲁夫12年前惊人的预言,解释了今天美国对中国芯片所做的一切
  18. GitHub-demo:Image-Stitching
  19. 2021RSAC -- 网络韧性
  20. 无代码开发是什么?白码详解

热门文章

  1. C++11中std::function的使用
  2. 【Go】Go基础(二):学习网址汇总
  3. Grape Api 笔记
  4. mysql update时数据不存在新增_mysql sql语句新增判断,存在修改,不存在新增
  5. 24点游戏c语言链表做法,C语言实现24点程序(示例代码)
  6. kde重启_在Linux系统中出现KDE Plasma面板崩溃问题的解决方法
  7. python如何处理异常_python如何进行异常处理
  8. 提花原理与计算机,电脑提花袜的设计原理与方法:提花女袜
  9. 学习API网关遇到的名词
  10. Java 对象的生命周期