设计模式
robertXin
不为写代码而写代码
展开
-
随机应变的访问者模式(Visitor Pattern)
有一天,技术总监说要知道所有技术员工的工作情况,第二天,老板说要知道所有员工的业绩,再有一天,HR总监要知道所有员工的工资。每一次都是利用组合模式遍历出员工后获取员工的相关信息。也许你会说,直接把所有的信息全输出就行了,那估计你要被老板叼了,老板就想知道业绩,你把一个大表给看找,好吧,你可以回家了!让访问者模式来帮我们解决这个问题,类图如下: 可以看出,有个visitor,这就是访问者,貌似有...2014-04-30 17:26:33 · 295 阅读 · 0 评论 -
偷懒的代理模式(Proxy Pattern)
代理,百度百科解释道:以他人的名义,在授权范围内进行对被代理人直接发生法律效力的法律行为。 玩游戏的同学对代练肯定不陌生,找代练帮忙升级打怪,下面就以此例编写个简单的代理模式: 结构如图,首先定义一个游戏接口,接口有游戏的一些基本动作,如登录,打怪,升级。再定义一个玩家的类,继承游戏接口,实现动作。最后定义一个代理类,客户端通过调用代理实际完成玩家的动作。 <?php int...2014-04-04 17:27:16 · 151 阅读 · 0 评论 -
clone的原型模式(Prototype Pattern)
发邮件的功能想必都做过,发邮件相当的耗时,于是大多使用多线程来实现。但假设产生第一封邮件对象,放到线程1中运行,还没有发送出去,线程2也启动了,直接把邮件对象修改了,线程不安全了。在这里我使用原型模式来解决 <?php class Mail{ private $title; private $content; private $receiver; public func...2014-04-09 10:05:10 · 103 阅读 · 0 评论 -
助人为乐的中介者模式(Mediator Pattern)
还记得我刚毕业的第一家公司是做b2c的,当时要做一个进销存系统,相信做过的人都应该清楚。拿最简单的进销存系统为例,其可分为采购管理、销售管理、和存货管理,三个模块相互依赖,假设现在公司为一家卖电脑的经销商: 1、销售情况 销售部门要反馈销售情况,畅销就多采购,滞销就不采购。 2、库存情况 即使是畅销产品,库存都有100台了,每天才卖出去1台,也不需要采购了! 库房有货,才能销售,空手套...2014-04-09 16:52:59 · 223 阅读 · 0 评论 -
不求过程的命令模式(Command Pattern)
以前做对外做项目的时候,部门大致分为需求组,美工组,代码组,客户找到需求人员讨论需求,找到美工人员讨论页面,找到代码人员讨论功能。 <?php abstract class Group { public abstract function find(); public abstract function add(); public abstract function del...2014-04-11 16:15:27 · 120 阅读 · 0 评论 -
职责分明的责任链模式(Chain of Responsibility Pattern)
中国自古有重男轻女的观念,在古代,未婚女子要想出去逛街都要经过父亲的同意,而有丈夫的则要请示丈夫,如果丈夫去世了,有儿子的还得请示儿子,这就是所谓的“三从”。果然很苦逼!我们用程序来模拟一下这个过程: <?php interface IWomen{ public function gettype(); public function getRequest(); } ...2014-04-14 11:57:16 · 173 阅读 · 0 评论 -
另辟蹊径的装饰模式(Decorator Pattern)
在天朝,没钱的孩子从小就得学好”数理化“,为的就是能考个好分数。但并不是每一个小孩都是读书的料,有的小孩就是没那个天赋,小的时候,记得每次考试后都要给家长报告,然后要签字,表示已经给家长看过了。小明就是个没天赋的孩子,他这次又考砸了,语文65,数学68,英语66,但小明并不笨,直接跟老爸说考这么点估计会被暴打一顿,因此他决定先说”这次考试语言最高是75,数学最高是78,英语最高是88“,再汇报自...2014-04-14 16:43:39 · 105 阅读 · 0 评论 -
足智多谋的策略模式(Strategy Pattern)
夏天来了,深圳的大小梅沙必将是人满为患,大家在游泳时还是要注意安全地。那如果真人有溺水了怎么办?有人会打120,有人会做人工呼吸(必须得是个美女才行),有人会用拳头叩击心前区急救。他们的做法都是对的,只是不同情况,不同的人会有不同的策略!既然这样,那就用策略模式来模拟下,类图如下: 由图可以看出,策略模式非常简单,直接上代码: <?php interface IStrate...2014-04-15 13:40:48 · 216 阅读 · 0 评论 -
美中不足的适配器模式(adapter pattern)
之前买过个ipad玩,当用其充电器充电时遇到了点麻烦(有的同学应该知道),家里没有适合它的插座。还好,卖家送了个接头转换部件,问题轻松解决。这就是适配器的作用。 <?php interface IUserInfo{ public function getUserName(); public function getUserId(); public function get...2014-04-17 09:59:34 · 120 阅读 · 0 评论 -
树状的组合模式(composite pattern)
一个公司是由每一个工作的成员组成,每一个成员有不同的属性(名字,职位,薪水),根据不同的等级,构成一个树形的结构。总经理是这个棵树的根节点,因为他没有上级,部门经理是树枝节点,因为他既有上级也有下级,小喽啰是叶节点,因为他是最底层的苦逼,没有下级。现用组合模式将这个树展示出来,类图: 代码如下: <?php abstract class Corp { private $name ...2014-04-17 15:56:19 · 254 阅读 · 0 评论 -
隔墙有耳的观察者模式(Observer Patern)
登录系统想必大家都做过,验证用户名密码就登录成功,日志系统应该记录此次登录,如果登录出错,安全系统应该会记录此次错误,邮件系统也应该会发送相关邮件给管理员,等等。这就好像登录系统被很多人监视一样,一旦有什么风吹草动,立即会被其它系统获悉。那就用观察者模式来试试,类图如下: 很简单的模式,实现代码: <?php interface Observable{ function atta...2014-04-22 15:07:34 · 185 阅读 · 0 评论 -
金玉其外的门面模式(Facade Pattern)
今天说一个简单易懂的封装模式——门面模式。 <?php interface ILetterProcess{ public function writeContent( $content ); public function fileEnvelope( $address ); public function letterIntoEnvelope(); public ...2014-04-24 09:33:26 · 128 阅读 · 0 评论 -
私人定制的建造者模式(Builder Pattern)
在模板方法模式中,我们知道了如何通过模板批量的制作Hummer,但你会发现Hummer的start,stop,alarm,enginBoom这四个动作都是按固定顺序进行的。那么如果现在要制作任意顺序动作的Hummer该如何设计呢?比如说我现在制作A类型HummerH1,它先启动,后停止,就这两个动作。B类型HummerH2,它先启动,后鸣笛,最后停止。A类型HummerH2,先启动,后有引擎声。...2014-03-28 14:57:29 · 143 阅读 · 0 评论 -
不明觉厉的模板方法模式(Template Method Pattern)
啥是模板方法模式?好像很厉害的样子。 现有两种车,悍马H1和悍马H2,对它们进行测试,需要开动,停止,鸣笛,引擎声。这两车有四个相同的动作,但是动作的内容不同,最后的测试执行这四个动作,就是说测试是相同的。那我们这么设计如何? 这就是模板方法模式,是不是超简单! <?php abstract class HummerModel { protected abstra...2014-03-27 10:21:04 · 156 阅读 · 0 评论 -
富足的抽象工厂模式(Abstract Factory Pattern)
如果把工厂方法模式看作是小厂的作风,那抽象工厂模式绝对是土豪,因为它具有多个业务品种,工厂富足了! 抽象工厂模式的官方定义为:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。 在工厂模式的例子中,可以出产出超级用户和普通用户,如果现...2014-03-26 11:21:54 · 100 阅读 · 0 评论 -
变化多端的状态模式(State Pattern)
现在写字楼越建越高,码农上个班不但要挤个地铁,还要挤个电梯。电梯的运行简单有这么几个状态:运行、停止、关闭、打开,电梯想要正常的运行,就必须得遵循一定的规则,例如运行的时候不能开门,开门状态不能运行。按照平常的逻辑,分别创建open,close,run,stop四个方法,方法里通过switch当前的状态,执行不同的动作。这种处理有几个问题: 1、扩展性太差 如果电梯还有两个状态:通电状态和断...2014-05-08 10:20:48 · 170 阅读 · 0 评论 -
原始的解释器模式(Interpreter Pattern)
解释器模式的定义(现实项目中很少遇到,因此直接理论先。。。) 解释器模式是一种按照规定语法进行解析的方案,在现在项目中使用较少,其定义为:给定一门语言,定义它的方法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。其构成如下: 1、AbstractExpression——抽象解释器 具体的解释任务由各个实现类完成,具体的解释器分别由TerminalExpression和N...2014-05-13 09:48:06 · 146 阅读 · 0 评论 -
懂得分享的享元模式(Flyweight Pattern)
今天学习一个对php来说意义不大的模式——享元模式 竟然意义不大为什么要学?我一直认为设计模式是不针对语言的,相对于目前的php意义不大,并不表示其本身没有意义,其在编译型的语言里还是有很多的用处的。 享元模式的定义 享元模式是池技术的重要实现方式,其定义为:使用共享对象可有效地支持大量的细粒度的对象。太简单了,通俗地说就是把经常要使用到的对象共享起来,而不去从新创建而占用内存。其大...2014-05-14 14:14:02 · 120 阅读 · 0 评论 -
变脸不变质的桥梁模式(Bridge Pattern)
有一哥们是搞山寨货的,什么流行就搞什么。自己有个厂子,前些时间服装挣钱,就生产衣服,现在搞手机挣钱,搞手机,这哥们很聪明,就换了个产品,工人,厂房都不变。他是怎么做到的?用类图来模拟一下: 由类图可以看出这哥现有两家公司,一个搞房地产,一个搞山寨货(phone),房地产是长久渠道,山寨随时可能变更。 用PHP来实现: <?php abstract class Corp { ...2014-05-22 09:58:41 · 129 阅读 · 0 评论 -
创建类模式大PK(总结)
创建类模式包括工厂方法模式、建造者模式、抽象工厂模式、单例模式和原型模式,它们都能够提供对象的创建和管理职责。其中的单例模式和原型模式非常容易理解,单例模式是要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新对象,这两个不容易混淆。下面主要分析其它三种模式。 一、工厂方法模式VS建造者模式 1、意图不同 在工厂方法模式里,关注的是一个产品整体,无须关心产...2014-05-23 10:16:44 · 96 阅读 · 0 评论 -
结构类模式大PK(总结)
结构类模式包括适配器模式、桥梁模式、组合模式、装饰模式、门面模式、享元模式和代理模式,它们都是通过组合类或对象产生更大结构以适应更高层次的逻辑需求。 一、代理模式VS装饰模式 代理模式把当前的行为或功能委托给其他对象执行,代理类负责接口限定:是否可以调用真实角色,以及是否对发送到真实角色的消息进行变形处理,它不对被代理类的功能做任何处理,保证原汁原味的调用。代理模式使用到极致开发就是A...2014-05-26 09:41:58 · 117 阅读 · 0 评论 -
行为类模式大PK(总结)
行为类模式包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法、访问者模式,我去,好多。。。下面主要挑选几个比较容易混淆且比较重要的模式进行对比说明。 一、命令模式VS策略模式 1、关注点不同 策略模式关注的是算法替换的问题:一个新的算法投产,旧算法退休,或者提供多种算法由调用者自己选择使用,算法的自由更替是它实现的...2014-05-29 09:42:08 · 139 阅读 · 0 评论 -
跨战区模式PK(总结)
创建类模式描述如何创建对象,行为类模式关注如何管理对象的行为,结构类模式则看重于如何建立一个软件结构,虽然三种模式的着重点不同,但是在实际应用中还是有重叠的,会出现一种模式适用,另外一种模式也适用的情况。 一、策略模式VS桥梁模式 策略模式是一个行为模式,旨在封装一系列的行为,封装的格式(算法)不同,行为也就不同;而桥梁模式则是解决在不破坏封装的情况下如何抽取出它的抽象部分和实现部分,...2014-05-30 09:47:56 · 192 阅读 · 0 评论 -
设计模式六原则
一、单一职责原则(SRP) SRP原话解释:There should never be more than one reason for a class to change. 好处: 1.类的复杂性降低,实现什么职责都有清晰明确的定义。 2.可读性提高。 3.可维护性提高。 4.变更引起的风险降低。变更是必不可少的,如果接口是单一职责做得好,一个接口修改只对相应的实现类有影响,对其...2014-03-17 20:37:06 · 116 阅读 · 0 评论 -
自私的单例模式(Singleton Pattern)
说到单例模式,肯定觉得简单啊,不就只有一个实例嘛,自私的家伙。 确实很简单,但是现在我有几个问题 1.单例模式有什么好处? 2.单例模式有什么缺点? 3.什么情况下适合用单例模式? 4.如果我想只有两个实例,怎么办? 一。优点: 1.由于单例模式在内存中只有一个实例,减少内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非...2014-03-20 11:39:31 · 79 阅读 · 0 评论 -
苦逼的工厂模式(Factory Method Pattern)
提到工厂,流水线的工作,不停的重复重复着,真是比我们码农还苦逼。 工厂模式使用的频率也是非常高,它的官方解释为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。 如图所示,系统中有超级用户与普通用户两种,定义一个公共接口User类,定义一个公共抽象工厂类abstractUserFactory,userFactory类通过继承abst...2014-03-25 10:45:48 · 83 阅读 · 0 评论 -
回到过去的备忘录模式(Nemento Pattern)
今天学习一个比较少用的备份模式-----备忘录模式。通过名字应该都可以知道其作用了,就是对象或对象属性作备份,方便随便取回。拿打怪来说,开始我有100血,打着打着,剩20了,我想重玩,重新回到100血的状态。用备忘录实现此情形的类图如下: 没错,一个简单的功能备忘录标准要用三个类实现。可能你会说为什么要个备忘录管理类,没必要啊,没有管理类功能照样可以实现,但是这样客户端需要关心备忘录,这对迪米...2014-04-25 11:10:38 · 179 阅读 · 0 评论