设计模式与原则
dongxie548
IT民工一枚
展开
-
设计模式入门-代理模式(php版)
关于这个模式暂时理解的不深,直接上代码吧。常规的代理模式的uml类图如下所示: 从上图中可以看出client需要调用realsubject类的服务,proxy类其实充当的是一个中介的角色。至于为什么要加上这样一层中间的代理,暂时不理解,如果有了解的朋友可以文章的下方评论区提出,不胜感激。代理模式的官方定义是:为另一个对象提供一个替身或占位符以控制对这个对象的访问。写了一个男原创 2015-03-30 10:24:58 · 740 阅读 · 0 评论 -
设计原则之接口隔离原则(ISP)
你是否遇到过非常“胖”的接口呢?举个例子来说吧:有一个跟动物有关的接口,代码如下:原创 2015-08-15 21:41:16 · 1748 阅读 · 0 评论 -
设计原则之开放闭合原则(OCP)
在《敏捷软件开发-原则、模式与实践》一书中,对开放闭合原则的定义为:软件实体(类、模块、函数等)应该是可以扩展的,但是不可以修改。简言之,两个特征:1、对于扩展是开放的;2、对于修改是关闭的这两点特征貌似自相矛盾,怎么样在不改动模块源码的情况下去更改他的行为呢?如果不更改一个模块,又怎么能够去改变它的功能呢?答案很简单,就是抽象。模块可能对抽象体进行操作。由于模块依赖于一个原创 2015-08-13 16:00:32 · 4125 阅读 · 2 评论 -
MVC与三层模型探讨
最近在学习mvc设计模式,拿它和三层架构做了一些比较: 我认为mvc设计模式,关键在于构建model,model就是mvc模式的灵魂,他包含了三层架构里面的 “实体规范层”、“行为规则层”、“数据访问层”;控制器(Controller)用来收集view提供的用户数据,传递给model,同时返回model处理后的数据给view。model的设计可以参考三层架构的设计方法,将实体、行为规则(业务转载 2015-07-21 15:10:57 · 2450 阅读 · 0 评论 -
数据源架构模式之行入口模式
在上一篇文章中我们提到了表入口模式,今天我们来讲行入口模式。在《企业应用架构模式》中对行入口模式的定义是:充当数据源中单条记录入口的对象。每行一个实例。与表入口模式一张表作为一个对象不同,行入口模式使用表中的一行数据作为一个对象。行数据入口的主要缺点在于需要为表中的每一个字段设置一个set/get方法,书写起来比较冗长。行数据入口和活动记录模式的主要区别在于行数据入口仅包含数据库访原创 2015-08-13 18:15:27 · 1235 阅读 · 0 评论 -
设计原则开篇
bob大叔在他的著作《敏捷软件开发-原则模式与实践》一书中提到拙劣设计的七种症状:1、僵化性:指的是设计难以改变;2、脆弱性:设计易于遭到破坏;3、顽固性:设计难以重用;4、粘滞性:难以做正确的事情;5、不必要的重复性:过分设计;6、不必要的重复:滥用鼠标进行复制黏贴7、晦涩性:混乱的表达设计的“臭味”主要是因为他们违背了一个或多个设计原则,这些原则包括:原创 2015-08-08 12:14:57 · 911 阅读 · 0 评论 -
php设计模式入门-注册表模式
对于这个模式的应用场景不是太好总结,只是根据之前的经验,注册表类里面经常会存储一些别的地方需要用到的对象,比如redis、memcache类,还比如配置信息config类等,它扮演的是一个类似于全局变量的角色。具体的实现其实非常简单,如下代码所示:<?phpclass Registry{ static $instance; public $containers = a原创 2015-07-29 21:55:39 · 1203 阅读 · 0 评论 -
php设计模式入门-单例模式
在日常开发过程中,常常会遇到有些类是不需要重复实例化的,比如数据库连接,在这种情况下,单例模式就是最佳的解决方案。正好上次面试也有被问及这个模式,今天在这里做个总结。先来看一个最简单的单例模式的实现:<?phpclass Singleton{ static $instance; static function getInstance(){ if(原创 2015-07-29 21:46:56 · 733 阅读 · 0 评论 -
[转]PHP hook钩子类
不多说什么,用于做插件,消息监听之类的东西,反正用处挺大的,不清楚的请移步看看百科知识。 当然,代码之后只有使用的测试,而没有删除的测试,各种问题自行解决吧,还有功能不强,理论上应该可以设置优先级才对,但是这里不行,不完善的原因吧。 基本原理还是很简单的,用列表存储对应的调用函数或方法,然后执行的时候调用并且返回一下就行了。还有钩子的作用是修改数据,所以必须传递一个参数过去,即转载 2015-07-06 21:33:49 · 3394 阅读 · 0 评论 -
php设计模式入门-命令模式
场景:某家公司需要生产一款遥控器,可以控制家用电器的开关,该开关拥有五列两排按键,现在需要我们为这个遥控器编写程序来实现相应功能。解决方案1:看到这样的需求场景,我们第一个想法可能是模拟js的onclick事件,每个按钮按下时触发事件,js调用后台程序执行相应逻辑。弊端:这样的做法其实是一种硬编码。即各按键一次绑定永不能修改,在这个以人为本尊重用户体验的大环境下这十分的不人性化。接下我原创 2015-05-01 15:48:38 · 677 阅读 · 0 评论 -
php设计模式入门-观察者模式
场景:一个气象站点,当温度、湿度或气压发生改变时都要像订阅了该气象服务的用户推送提醒,假设用户拥有三种电子产品:mac、iphone和apple watch。第一版的设计代码如下:WeatherData.php<?php/** * 气象站类,用于提供气象数据,数据变化时及时推送至用户的设备 * * @author ben * */class WeatherDat原创 2015-04-12 21:08:20 · 929 阅读 · 0 评论 -
设计模式入门-装饰器模式(php版)
场景:一个朋友开了家咖啡店,供应了各种类型的咖啡,最初系统的设计如下uml类图所示:Change:咖啡里面可以加很多调料,比如冰、糖、牛奶等,这些调料需要额外收费,按照之前的设计,我们如果想要得到每种咖啡的费用,我们就得新建六个类来实现,对应的类图如下:Problem:试想调料有n种,咖啡有m种,难道我们要设计m*n个类来实现要求吗?解决方案:一、原创 2015-03-23 09:51:35 · 661 阅读 · 0 评论 -
设计模式入门-策略模式(php版)
场景:一个模拟鸭子的游戏,游戏中有各类鸭子,鸭子会叫,会游泳。 初步设计方案图如下uml类图所示: Change:这个初期看上去无懈可击,直到有一天游戏需要鸭子会飞,此时最简单的解决方案莫过于在父类中增加一个fly方法,uml图如下所示:有一天灾难发生了:游戏中有很多橡皮鸭飞来飞去。。。。此时最简单的解决方案莫过于:覆盖掉RubberDuck类中的f原创 2015-03-18 17:57:14 · 493 阅读 · 0 评论 -
设计模式入门-状态模式(php版)
想必大家都用过自动售卖的自动饮料机吧,塞入硬币或纸币,选择想要的饮料,饮料就会在机器的下方滚出。大家有没有相关如果用程序去写一个饮料机要怎么样实现呢?首先我们可以分享一下这部饮料机有几种状态一、没有钱的状态二、有钱的状态三、售出的状态四、销售一空的状态好吧,知道了这些状态之后我们开始写代码了!JuiceMachine.php<?php/** * 饮料机 *原创 2015-03-30 17:26:23 · 754 阅读 · 0 评论 -
设计模式入门-迭代器模式(php版)
在深入研究这个设计模式之前,我们先来看一道面试题,来自鸟哥的博客,题目是这样的:使对象可以像数组一样进行foreach循环,要求属性必须是私有。不使用迭代器模式很难实现,先看实现的代码:sample.php<?phpclass Sample implements Iterator{ private $_arr; public function __construct(原创 2015-03-30 11:33:49 · 604 阅读 · 0 评论 -
数据源架构模式之表入口模式
martin fowler在《企业应用架构模式》一书中将我们平常接触到的应用开发分为三层:表现层、领域层和数据源层。其中领域层的领域逻辑模式有:事务脚本、领域模型以及表模块。1、事务脚本最容易理解也最易于开发,不过由于易造成代码重复等问题,不利于后期的维护,比较适合开发逻辑较为简单的业务,比如只有几个用于展示企业信息的企业站等;2、领域模型是三种模式中最为复杂的模式,缺点显而易见,需要原创 2015-08-03 21:34:50 · 1240 阅读 · 0 评论