设计模式
2lovecode
醉心于技术的纯粹人,乐于不断提升带来的成就感,苦于缺失发展方向带来的迷茫感。技术之路枯燥且坎坷,希望能结识更多的同路人和引路人,一起且行且珍惜
展开
-
设计模式3.1-装饰者模式
装饰者模式:动态地将责任附加到对象上在装饰者模式中,装饰者和被装饰者继承自同一个类。装饰者会持有一个被装饰者的对象,在方法中通过在调用被装饰者相应方法的前后添加自己的逻辑,从而达到添加功能的目的。装饰者模式提供了一种类似于继承的另一种扩展方式 在此示例中,具体Human和HumanDecorator同属Human抽象类。原创 2018-01-12 09:50:31 · 216 阅读 · 0 评论 -
设计模式12.1--状态模式
GitHub源码 这次我们学习的是和策略模式类图相似,但‘意图’大不相同的状态模式。策略模式的意图是通过把行为委托给算法对象实现类的弹性扩展,是类似于继承的类扩展方式,算法类的选择是客户决定的。而状态模式是为了消除类中的if else结构的一种解决方案,内部状态的改变会动态改变状态类的选择。状态模式:允许对象在内部状态改变时,改变它的行为。在示例代码中,我们使用一个简单的售卖机模型进行实...原创 2018-04-08 17:29:11 · 413 阅读 · 0 评论 -
设计模式11.1--迭代器模式
迭代器模式:提供顺序访问聚合对象中各个元素的方法,而又不暴露其内部的实现 把遍历的任务放到迭代器上,而不是聚合对象上,简化了聚合的接口和实现,让责任各得其所示例中,FirstAggregate是聚合对象, FirstIterator提供了遍历FirstAggregate中各个元素的方法。<?phpinterface MyAggregate{ public fun...原创 2018-02-24 14:54:19 · 216 阅读 · 0 评论 -
设计模式10.1-模板方法
模版方法:在一个方法中定义一个算法的框架,规定要执行哪些算法,以及算法执行的顺序。并且将一些算法的实现延迟到子类中。这样做的好处是可以在不改变算法结构的基础上,自由地处理一些算法的实现。在本示例中,RunMachineTemplateMethod的run方法,定义了一个算法框架,其中把openPower和display的实现延迟到了子类中。示例中的两个子类是RunComputer...原创 2018-02-14 19:01:48 · 240 阅读 · 0 评论 -
设计模式5.2--严格的单例模式
单例模式:确保一类只有一个实例。普通的单例在clone时,仍然会出现两个单例的情况, 在将__clone()魔术方法改为private后可杜绝此情况。<?phpclass Singleton{ static private $instance = null; private function __construct() {} stati...原创 2018-02-27 15:07:38 · 328 阅读 · 0 评论 -
设计模式6.1-命令模式
命令模式:将请求封装,并把发出请求的对象和处理请求的对象解耦,并支持撤销请求的操作。关键元素:客户,调用者,请求,接收者。在我们的示例中,客户对应Test类,调用者对应Console(控制台),命令对应Command接口的具体实现类,接收者对应Light(灯)和Fan(电风扇)。原创 2018-01-30 09:59:01 · 258 阅读 · 0 评论 -
设计模式7.1-管道模式
管道模式:对于管道模式来说,有3个对象:管道,载荷,过滤器(阶段,阀门均可)。 我们的目的是在管道中对载荷进行一系列的处理。因为可以对过滤器进行动态的添加, 所以对载荷的处理可以变得更加灵活。但同时带来的问题是,在过滤器过多时, 我们很难把握整体的处理逻辑。而且在某一个过滤器对载荷处理后,因为载荷改变, 会造成下一个过滤器中的逻辑出错。 在我们的示例中:管道类是Pipeline,载荷是在实...原创 2018-02-09 10:52:20 · 3577 阅读 · 0 评论 -
设计模式8.1-适配器模式
适配器模式:将目标接口,转化为客户期望的接口。在我们的示例中,目标接口是MonkeyInterface, 但是客户(Test类的run方法)期望的是PersonInterface,即客户期望处理的Person。 我们的处理方式是在客户和目标接口中间加一个适配器(MonkeyAdapter),客户使用的是适配器实例,适配器 实例最终会将相应请求委托给它持有的目标对象来处理(MonkeyAd...原创 2018-02-11 10:36:06 · 237 阅读 · 0 评论 -
设计模式9.1-外观模式
外观模式:定义了一个统一的接口,用来访问子系统中的一群接口。 外观模式和适配器模式在实现上比较相似,但是其应用的意图有所不同。 适配器模式意图改变一个接口成另一个接口,外观模式意图将一群接口简化在示例中,我们有一个子系统House,其中有一群接口(door light air)。 当我们回家时,要开门,打开灯,打开空调。一个回家动作统一了多个接口。<?phpinterfa...原创 2018-02-11 10:37:18 · 208 阅读 · 0 评论 -
设计模式1.2-策略模式(has setter)
策略模式:定义一个算法族(继承/实现的同一个抽象类/接口),同一族的算法(具体的类)可以相互替换,算法的改变不影响客户的使用。有setter的策略模式,可以在实例化后动态指定算法。原创 2018-01-10 11:01:19 · 213 阅读 · 0 评论 -
设计模式1.1-策略模式(no setter)
策略模式:定义一个算法族(继承/实现的同一个抽象类/接口),同一族的算法(具体的类)可以相互替换,算法的改变不影响客户的使用。没有setter的策略模式,直接在构造方法中指定算法。原创 2018-01-10 10:57:42 · 224 阅读 · 0 评论 -
web应用高复用,可扩展实现的一点设计思路
主要目的:1.实现业务流程的清晰化2.实现功能的高可复用性3.实现业务的高可扩展性4.可在web app,console app, api等形式中自由迁移原创 2018-01-16 17:04:22 · 1039 阅读 · 0 评论 -
设计模式5.1-单例模式
单例模式:确保一类只有一个实例。因为有多线程的机制,所以站在java的角度,单例的实现有3种形式:同步,急切,双重加锁 但是php因为不支持多线程,所以对于多线程中单例的实现就不必深究。原创 2018-01-24 10:03:39 · 207 阅读 · 0 评论 -
设计模式4.3-工厂模式之抽象工厂
抽象工厂:提供一个接口,用来创建相关或依赖对象的家族,而不需要明确指定具体类在我们的示例中,MaterialFactory是抽象工厂的抽象类,它定义了创建Water和RawNoodles这两个同属一个家族的对象的方法。在具体的工厂类中,每一个对象的创建都使用工厂方法的方式创建。原创 2018-01-22 10:51:47 · 258 阅读 · 0 评论 -
设计模式4.2-工厂模式之工厂方法
工厂方法:定义一个创建对象的接口,由子类决定实例化哪个类,把实例化类的逻辑推迟到子类中在本示例中:我们在CakeStore的抽象类中定义了创建Cake的接口createCake,子类在继承此抽象类后必须实现此方法,因此,决定实例化哪个类的逻辑推迟到了子类,由子类决定。原创 2018-01-22 10:50:19 · 331 阅读 · 0 评论 -
设计模式4.1-工厂模式之简单工厂
简单工厂模式:创建对象的逻辑抽取出来,放到工厂中实现 在本示例中:客户类Test获取对象实例door的代码放到工厂类Factory中实现。 带来的好处是,在我们需要添加door的类型时,不必更改Test类的代码,只需要在factory中添加即可。原创 2018-01-22 10:48:31 · 349 阅读 · 0 评论 -
php框架容器实现(DI)的一般方式
文章最后有一个简单的容器实现示例和使用示例,可以参考理解,对应的github源码:GitHub源码一个仿照yii2框架容器实现的代码示例:GitHub源码 ,其中register方法对应set方法,resolve方法对应set方法 或 GitHub源码一个摘自laravel框架容器实现和使用示例:GitHub源码psr-11容器GitHub地址规范1.容器类一般有get和set方...原创 2018-08-01 15:55:49 · 1702 阅读 · 0 评论