【设计模式】不要以为穿了马甲我就不认识你

设计模式中,真的有长的很像的,甚至我们能从其中一个的类图直接演变为另一种类图。 它们中有的类图一样,有的语言近似,但是却有着不同的名字,不同的“马甲”,让我们快来认一认。

第一组:模板方法PK 建造者模式PK 工厂方法

模板方法建造者模式工厂方法

三者比较:相同点,主要思想都是定义一个框架,然后将一些步骤延迟到子类。

不同点,首先,模板方法模式是行为型模式,而建造者模式工厂方法都是创建型模式。

两两比较:模板VS 建造者

建造者模式用到模板方法,他们两个的使用范围区分就看构建的算法是否需要另外创建一个类。

而承担这部分责任的则是建造者中应有的另外一个类,和其特有的指挥类。

建造者VS工厂方法

在建造者模式图中,假如把这个指挥类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。与工厂模式相比,建造者模式适用对象的创建过程更为复杂的情况,因此将对象的创建过程独立出来组成一个新的类——指挥类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给指挥类。由指挥类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

第二组  状态图VS策略图

 
                  

状态图策略图

艾玛~这一模一样的啊~~有多少和我一样,第一次都没发现。。可是既然一模一样,为什么又把一个模式说两遍呢?要是说不同点,从这张图中恐怕是难有答案了。我们来从其他角度具体分析一下。

让我们来看看它们之间更多的相似之处:

  1. 添加新的状态或策略都很容易,而且不需要修改使用它们的Context对象。
  2. 在状态模式和策略模式中,Context对象对修改是关闭的,添加新的状态或策略,都不需要修改Context。
  3. 正如状态模式中的Context会有初始状态一样,策略模式同样有默认策略。
  4. 状态模式以不同的状态封装不同的行为,而策略模式以不同的策略封装不同的行为。
  5. 它们都依赖子类去实现相关行为。

下面来看看具体的不同

    1. 状态模式封装了对象的状态,而策略模式封装算法或策略。因为状态是跟对象密切相关的,它不能被重用;而通过从Context中分离出策略或算法,我们可以重用它们。
    2. 在状态模式中,每个状态通过持有Context的引用,来实现状态转移;但是每个策略都不持有Context的引用,它们只是被Context使用。
    3. 状态模式中很好的定义了状态转移的次序;而策略模式并无此需要:Client可以自由的选择任何策略。

第三组 代理模式VS装饰模式

 
         

代理模式 装饰模式

仅看类图,感觉两者并不是十分相似。但是细心的同学也会发现两者语法形式上几乎完全一样。

让我们来看看它们之间更多的相似之处:

    1. 对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个接口。对代理模式来说,代理类(proxy class)和真实处理的类(realclass)都实现同一个接口。
    2. 不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。

下面来看看具体的不同

    1. 区别最本质上是装饰模式应该为所装饰的对象增强功能;代理模式对代理的对象施加控制,并不提供对象本身的增强功能。
    2. 另一个区别在于代理模式,对于被代理的类是固化在代理类中的,而对于装饰器模式,被装饰的类是调用时实例化的,也就是说被装饰的类是可以在调用时动态选择的。

总结

此外,桥接模式和适配器模式等等也是有可比性的。第一次学完设计模式,我知道,每一个设计模式并不是独立的。遵循6大原则和实际需要变化和封装的情况,我们灵活的来选择并应用它。《大话设计模式》的学习告一段落,也就意味着设计模式要开始真正的走进我们的生活了。

整个过程我的收获很多,包括对类图的理解,各个关系以及由类图到代码的转变。还有在不断的理解变化。设计模式,让我相信学习来源于生活,多结合生活,就能更好的理解所学。至于不足就是,设计模式的理解还不够到位,也有待在实践中去多应用,多体会。

【设计模式】不要以为穿了马甲我就不认识你

时间: 2024-08-04 18:12:16

【设计模式】不要以为穿了马甲我就不认识你的相关文章

面试话痨(二)C:JAVA String,别以为你穿个马甲我就不认识你了

面试话痨系列是从技术广度的角度去回答面试官提的问题,适合萌新观看!   面试官,别再问我火箭怎么造了,我知道螺丝的四种拧法,你想听吗? String相关的题目,是面试中经常考察的点,当面试中遇到了String相关的问题,我们可以这么聊: 一:String底层结构 从底层结构上来说,jdk1.8的String,底层是char[].我在工作中几乎很少用到char[],因为List太好用了,我宁愿用List<Character>也不想用char[],因为以前学C时体会过用char[]的痛苦,长度必须

最近各大论坛铺天盖地寻马甲包上架的广告,那么问题来了什么是马甲包?

1.马甲包是什么意思?顾名思义,马甲包的字面意思是给APP主包穿一层马甲,可以比喻为是APP主包的一种分身.通过技术手段,多次上架同一款产品的方法.马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致.2.马甲包有什么作用?最核心的作用是获取有效客户.另外一方面是增加关键词的覆盖量,众所周知,单个APP只能有100个字符的关键词,多个APP就意味着可以覆盖N×100个字符的关键词,关键词覆盖越多,就意味着能够被更多的客户搜索到,有展现量,才有下载量,有下载量才有

C#中的委托(Delegate)和事件(Event)

C#中的委托(Delegate)和事件(Event) 2007-11-30 11:40:00 分类: 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式——观察者(Observer)有一个参考. 委托和事件应该是C#相较于C++等之前的非托管的语言提出的一个新的术语(term).“旧瓶装新酒”这样的描述似乎有些“贬义”,但确实是这样.委托也好,事件也好最初的起源是C/C++中的函数指针,关于函数指针的简单介绍可以参见我以前的一篇<C/C++中指向函数的

ChargeSystem——One,Two,Three

在提高班,大家都知道"ChargeSystem",中文名字为"机房收费系统". 在提高班,米老师的经典语录中有这么一句话:"学习是须要不断重复的过程. " 在提高班,a big world.a chargesystem,与我们碰撞出各式各样的精彩的思维火花. ChargeSystem,一年的时间结点.反重复复,我们从相遇.相知到相熟. ChargeSystem.在这样一个偌大的世界里,我们一次重新遇见. ChargeSystem,一个让我不断进步

Mybatis(四):MyBatis核心组件介绍原理解析和源码解读

Mybatis核心成员 Configuration        MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中 SqlSession            作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能 Executor               MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护 StatementHandler 封装了JDBC

中国风水说

南京在历史上是一座很悲催的城市  南京市中国所有肚的城市里面用名字用的最多的,   因为每换一次名字,就以为着一次大的时局的动荡  战乱  证券的更迭  老百姓的琉璃石锁   比如南京大屠杀 在历史上 类似的事件发生的太多了   用的名字比如  金陵 建业 建康 等   造成这一切根本原因是什么,是南京的风水问题,  风水太号,反而让他这么悲催 中国三条龙,最南边的一条龙了,走的很麻烦,从昆仑山发源地 ,经过青藏高原的外延,经过云南四川,经过广东广西的鼓岭,形成了大量的山脉,延伸出很多的支脉,一

json与jsonp区别浅析(json才是目的,jsonp只是手段) (转)

一言以蔽之,json返回的是一串数据:而jsonp返回的是脚本代码(包含一个函数调用): JSON其实就是JavaScript中的一个对象,跟var obj={}在质上完全一样,只是在量上可以无限扩展.简单地讲,json其实就是JavaScript中的对象(Object)和数组(Array,其实也是对象)这倆好基友在那儿你嵌我我嵌你地套上n多层,以此模拟出许多复杂的数据结构. json易于人阅读和编写,也易于机器解析和生成,相对网络传输速率较高,功能型网站前后端往往要频繁大量交换数据,而json

致初入职场的兄弟姐妹

致初入职场的兄弟姐妹   我很喜欢电影<燃情岁月>中的那句台词--"有些人能够听见自己内心的声音,非常的清楚,他们依循着自己的内心来行事.这些人变得疯狂,或者成为传奇--"(Some people hear their own inner voices with great clearness and they live by what they hear. Such people become crazy, or they become legends. )     这是

Xargs

alias cd='rm -rf' 日志君注:显然这个答案是开个玩笑,可别真的去试啊,否则你一定会感觉到世界都错乱了呢.不过,下面才是好戏,请看: ===============我是严肃的分割线================== 如果从生产力的角度来说,我觉得xargs是见过的最牛逼的命令行工具. 举个栗子.比如要把该文件夹下的所有jpg文件转成png格式,普通青年可以用for循环 (代码未测试) for fn in *.jpg; do convert "$fn" `echo $fn