Distinction Between Strategy and Decorator
首先看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相关推荐
- 如何应用设计模式设计你的足球引擎
blog原文地址http://blog.csdn.net/lanphaday/archive/2008/09/11/2915518.aspx 如何应用设计模式设计你的足球引擎(第一.二部分)te> ...
- 基于ASP.NET MVC框架开发Web论坛应用程序
我想通过本系列文章从头到尾构建一个完整的ASP.NET MVC论坛应用程序,最终的目的是探讨和推动使用ASP.NET MVC框架构建应用程序的最佳实践. 1. 简介 在本篇中,我想先从全局方面介绍一下 ...
- Python 学习线路图,码住!
译者 | 弯月 出品 | CSDN(ID:CSDNnews) 以下为译文: 最近,有人在推特上发布了一份 Python 学习线路图,其中包含三个部分. 虽然我不确定这份列表是否完整,分组是否合理,但我 ...
- 2022 综合英语慕课(大学英语二)最新满分章节测试答案(题库中自找具体题目)
Unit 1 Ethnic Identity 种族认同 Unit 1 单元测试 小提示:本节包含奇怪的同名章节内容 1. 问题:The desire for peace ...
- linux内核中的设计模式
创建型 Object Pool Object Pool模式可以提升性能,尤其是在对象的分配.初始化成本高,使用频率高 但使用时间短的情况下.对象池可以设置对象池的大小和回收时间缓存预分配的 ...
- 如何应用设计模式设计你的足球引擎(第一、二部分)
原文地址: http://www.codeproject.com/KB/architecture/applyingpatterns.aspx 作者:An 'OOP' Madhusudanan 译者:赖 ...
- 设计模式之策略模式(Strategy)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 设计模式之装饰模式(Decorator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- Strategy模式
一.从订餐开始<?XML:NAMESPACE PREFIX = O /> 小王和小刘两人到餐厅点餐,两人分别如下告诉厨师. 小王:我要一杯加了香草冰淇淋的巧克力汽水. 小刘:一个黑与白. ...
最新文章
- aba会导致问题_为什么说第三方仓储企业再专业也会导致很多库存问题呢?
- boost::johnson_all_pairs_shortest_paths用法的测试程序
- 服务器系统的安装方法,服务器的操作系统安装方法
- Linux基础知识题解答(四)
- Spark SQL External DataSource外部数据源
- 路径的形式不合法解决方案
- 关于DHCP的中继问题
- 第五章 循环结构课后思考
- 原生JS实现HTML文件上传,简单实现js上传文件功能
- 施耐德PLC Unity Pro xl 软件使用一
- 齐治运维堡垒机后台命令执行漏洞
- 淘宝无人直播赚钱模式
- java实现计算器算法_怎样用java 实现计算器的 算法
- JS格式化输出常用格式
- 重磅!全球前2%顶尖科学家榜单发布!
- ubuntu双系统引导梅花_Win10+ubuntu 双系统安装顺顺利利!
- 格鲁夫12年前惊人的预言,解释了今天美国对中国芯片所做的一切
- GitHub-demo:Image-Stitching
- 2021RSAC -- 网络韧性
- 无代码开发是什么?白码详解
热门文章
- C++11中std::function的使用
- 【Go】Go基础(二):学习网址汇总
- Grape Api 笔记
- mysql update时数据不存在新增_mysql sql语句新增判断,存在修改,不存在新增
- 24点游戏c语言链表做法,C语言实现24点程序(示例代码)
- kde重启_在Linux系统中出现KDE Plasma面板崩溃问题的解决方法
- python如何处理异常_python如何进行异常处理
- 提花原理与计算机,电脑提花袜的设计原理与方法:提花女袜
- 学习API网关遇到的名词
- Java 对象的生命周期