当前位置: 首页 > 编程日记 > 正文

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

相关文章:

我竟然混进了Python高级圈子!

现如今,计算机科学、人工智能、数据科学已成为技术发展的主要推动力。无论是要翻阅这些领域的文章,还是要参与相关任务,你马上就会遇到一些拦路虎:想过滤垃圾邮件,不具备概率论中的贝叶斯思维恐怕不行;想试…

unity3d中旋转

自转是Rotate,绕转是RotateAround,LookAt旋转物体自身,使其正面朝向目标点以上操作都在transform中完成转载于:https://blog.51cto.com/568464209/1764050

Java常用方法

1. 把Strings转换成int和把int转换成StringString a String.valueOf(2); //integer to numeric string int i Integer.parseInt(a); //numeric string to an int String a String.valueOf(2); //integer to numeric stringint i Integer.parseInt(a); //numeric string …

request.getSession(false)到底返回什么

HttpSession session request.getSession(false); 很明显传false如果session不存在返回Null。

洞察疫情,微软推出新冠数据分析网站COVID Insights

来源 | 微软研究院AI头条COVID Insights 网站功能亮点持续数月的新冠疫情一路肆虐、席卷全球,世界各地的科研人员都在为此奋战,希望通过最先进的技术逐步揭开新冠病毒的神秘面纱。近日,微软亚洲研究院的研究人员基于在计算生物学、数据分析等…

LINUX 查找tomcat日志关键词

#查询catalina.out日志文件中的关键词为2016-04-13 11:26:00的日志信息grep -C 10 2016-04-13 11:26:00 catalina.out |more解释:grep :查询,筛选-C : grep的-A, -B, -C选项分别可以显示匹配行的后,前,后前多少行内容:10 &#xf…

转帖 javascript事件监听

原帖地址&#xff1a; http://www.cnblogs.com/AganCN/archive/2008/05/24/1206272.html 考虑这样的情形在IE浏览中处理&#xff0c;需要响应页面的按钮点击事件&#xff0c;有哪些方法呢&#xff1f;&#xff08;1&#xff09;onclick属性添加事件处理函数 <javascript>…

推荐系统发展的六大影响因子 | 深度

作者丨gongyouliu来源 | 大数据与人工智能&#xff08;ID: ai-big-data&#xff09;随着科学技术的进步&#xff0c;移动互联网快速发展&#xff0c;手机越来越便宜&#xff0c;拥有智能手机不再是一件遥不可及的事情&#xff0c;互联网用户规模已接近增长的顶点。摄像头和信息…

Spring源码分析【9】-SpringSecurity密码Remove原理

很明显代码已经说了认证完成移除credentials和其他某些安全数据 // Authentication is complete. Remove credentials and other secret data // from authentication org.springframework.security.authentication.ProviderManager.authenticate package org.springframewo…

Linux --进程间通信--共享内存

一、共享内存共享内存是最高效的通信方式&#xff0c;因为不需要一个进程先拷贝到内核&#xff0c;另一个进程在存内核中读取。二、 ipcs -m 查看共享内存ipcrm -m 删除共享内存三、主要函数shmget 创建shmctl 删除shmat 挂接shmdt 取消挂接********* man 函数名 查看*****四、…

如何用 Slack 和 Kubernetes 构建一个聊天机器人?| 附代码

作者 | Alexander Kainz译者 | 天道酬勤&#xff0c;责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;ChatOps可以让你使用基于聊天的接口来管理DevOps任务。本文主要让我们了解如何使用Slack构建一个简单的机器人来控制Kubernetes集群。最后我们可以使用…

在jsp调试后端绑定对象

在jsp调试后端绑定对象&#xff0c;这个调用层次非常深

一行代码轻松实现拖动效果

写JS实现拖动需要一大堆不便维护的代码&#xff0c;实属麻烦&#xff0c;Google了大半天&#xff0c;发现了一个优秀的Jquery插件EasyDrag&#xff0c;只需要一行代码便可轻松在主流浏览器上 实现拖动效果. $(document).ready( function() { $("#divPanel"…

Spring源码分析【8】-分布式环境SpringSecurity保持用户会话

1.SpringSecurity的权限控制流程是这样的&#xff1a;用户登录&#xff0c;基础信息UserInfo存在SpringSecurity的ThreadLocal里。 下面是contextHolder对象&#xff1a; final class ThreadLocalSecurityContextHolderStrategy implementsSecurityContextHolderStrategy {// ~…

【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!...

本站文章均为 李华明Himi 原创,转载务必在明显处注明&#xff1a; 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/308.html 各位童鞋请你们注意&#xff1a;surfaceview中确实有 onDraw这个方法&#xff0c;但是surfaceview不会自己去调用&#x…

“华为云杯”2020深圳开放数据应用创新大赛线上推介会成功举办,让深圳大数据在全球“跑”起来...

4月30日下午&#xff0c;“华为云杯”2020深圳开放数据应用创新大赛第三场线上推介会完美落幕。至此&#xff0c;从4月23日开始的三场云端推介会全部结束&#xff0c;全球各数字平台总观看量1000多万人次。深圳市政务服务数据管理局副局长王耀文、深圳市南山区副区长练聪、南山…

学习OpenCV——配置CUDA环境

大家都把GPU&CUDA说的很NB狠NB&#xff0c;于是&#xff0c;下一步想通过GPU加速程序运行。这一个星期&#xff0c;都在配置OpenCV的CUDA环境&#xff0c;今天终于以失败告终&#xff0c;原因是实验室的机器显卡不支持CUDA。。。伤不起啊&#xff0c;一星期啊&#xff01;&…

NLP带来的“科幻感”超乎你的想象 - ACL2020论文解读

来源 | 京东智联云开发者责编 | Carol近些年&#xff0c;人工智能无疑是信息技术领域最热门的技术之一。人工智能战胜世界围棋冠军、人工智能战胜游戏高手、人工智能医生看病会诊……不断进步的科技正推动着人工智能从一个无法实现的幻想&#xff0c;不断突破人类的想象&#x…

Vsftp 安装配置(转)

转:http://www.cnblogs.com/qingfeng2010/archive/2010/12/26/1917121.html 1.查看是否安装vsftprpm –qa|grep vsftpd 如果出现 vsftpd-2.0.5-16.el5_5.1 说明已经安装 vsftp 安装vsftp yum -y installvsftpd 2.测试 是否安装成功 &#xff08;ip 改成自己啊&#xff0c…

事务隔离机制原理分析以及是否可以防止订单超卖

事务的隔离机制是指&#xff1a; Read Uncommitted&#xff08;读取未提交内容&#xff09; Read Committed&#xff08;读取提交内容&#xff09; Repeatable Read&#xff08;可重读&#xff09; Serializable&#xff08;可串行化&#xff09; 具体的解释最经典的MySQL书《…

PHP中file_exists与is_file,is_dir的区别介绍

PHP中file_exists与is_file,is_dir的区别介绍作者&#xff1a; 字体&#xff1a;[增加 减小] 类型&#xff1a;转载 时间&#xff1a;2012-09-12 我要评论很显然file_exists是受了asp的影响&#xff0c;因为asp不但有fileExists还有folderExists,driverExists&#xff0c;那么P…

推荐算法工程师的成长之道

作者 | gongyouliu来源 | 大数据与人工智能&#xff08;ID: ai-big-data&#xff09;本文&#xff0c;作者会基于自己的实践经验讲述推荐算法工程师的成长之道&#xff0c;这里的“道”有发展路径和道(道理、方法论、经验、智慧)两层意思。所以本文除了讲解推荐算法工程师的成长…

JVM内存溢出的几种情形

1.堆溢出 原因&#xff1a;大量对象占据了堆空间&#xff0c;而这些对象都有强引用导致无法回收&#xff0c;当对象大小之和>Xmx参数指定的堆大小时导致溢出&#xff01; List<byte[]> list new ArrayList<>();for (int i 0; i < 10240; i) {list.add(new…

Android Market 链接的生成与分享

通过Java包名直接定位到你的App http://market.android.com/details?id<java包名> 或者 market://details?id<java包名> 范例&#xff1a;market://details?idcom.skyd.luckywheel 这将直接在菜市场中显示你的App详细介绍页。 通过Java包名搜索App http://marke…

Centos6/7下静默安装oracle10g

Centos6/7下静默安装Oracle10g 远程安装oracle10g,通过网上资料&#xff0c;不断摸索成功安装。先在本地虚拟机Centos7上做实验&#xff0c;快照恢复快照恢复&#xff0c;安装了几十次成功之后&#xff0c;再在服务器Centos6上安装&#xff0c;(6和7还是有区别的&#xff0c;比…

String和常量池

jdk1.6之前常量池属于永久代&#xff0c;jdk1.7以后移到堆中。 String s1 "abc";// 放在常量池中String s2 "abc";// 从常量池中查找String s3 new String("abc");//new放在堆中String s4 new String("abc");String s5 s1.inter…

CQRS体系结构模式实践案例:Tiny Library:领域仓储与事件存储

领域仓储&#xff08;Domain Repository&#xff09;与事件存储&#xff08;Event Store&#xff09;是CQRS体系结构应用系统中C部分&#xff08;Command部分&#xff09;的重要组件。虽然都是存储机制&#xff0c;但两者有着本质的区别&#xff1a;领域仓储是属于领域层的&…

​中国开启开源新纪元

距离“中国 Linux 第一人”宫敏博士用手提肩背的方式&#xff0c;将 20 盒装有 80G 容量的自由软件磁带背回中国转瞬已过 20 载&#xff0c;在宫敏博士的推动下&#xff0c;中国组建起国内第一个自由软件库&#xff0c;由此开源在第一代开发者心中的火种迅速传播。20 多年间&am…

kernel logo到开机动画之间闪现黑屏(android 5.X)

在BootAnimation開始画图之前&#xff0c;会先做一次clear screen的动作&#xff0c;避免出现前面的图干扰到BootAnimation的显示。 通过check main_log先确认播放开机动画是哪个function。在相应function删除clear screen的动作的相应代码。 /frameworks/base/cmds/bootanimat…

JScript Array对象的几个原型方法

代码 Array.prototype.inArray function(value) { for(vari 0; i <this.length; i) { if(this[i] value) { returntrue; } } returnfalse;};Array.prototype.max function() { for(vari 1, max this[0]; i <this.length; i) { …