十月西北之旅-内蒙阿拉善嘉峪关

一直不知道自己找的一张微博头像的风景取自哪里,只觉得很有感觉。直到开始计划国庆假期的旅游,了解到内蒙的阿拉善额济纳,才知道这就是胡杨树。它迎着初升的太阳,散发着希望与热情,还是绿色的枝叶透出一股朝气和意气风发。不过这次我们出游的目的,却是奔着额济纳秋天黄橙橙的胡杨林而去的。

约好了几个土豪朋友,规划了下额济纳及其他几个西北景点的旅游线路,提前两天才开始仓促地预定机票和酒店。最后选择了先直飞宁夏银川,再乘车前往100多公里外的内蒙阿拉善盟(左旗),第二天去腾格尔沙漠参观阿拉善英雄会越野车比赛,第三天前往距左旗600多公里的额济纳旗,第四天额济纳胡杨林,第五天上午额济纳黑城,怪树林,下午开始驱车前往嘉峪关,中途参观酒泉卫星发射中心-东方航天城,第六天上午嘉峪关长城,下午飞往兰州,再从兰州飞回广州。

temp

Continue reading 十月西北之旅-内蒙阿拉善嘉峪关

全面了解PHP设计模式-创建型结构型行为型

PHP5对面向对象编程的支持越来越大,因此用于Java等流行的OO语言中的设计模式也在PHP中用得越来越多,它使得我们的程序更加健壮,灵活,维护性或扩展性更好,甚至提高代码的性能。大多数 MVC PHP流行框架或开源类库中,都会用到一些经典的PHP设计模式。这几天抽空全面看了下三大类型的设计模式的PHP实现。设计模式不管是对于PHP还是Java,或是其他OO语言,其设计思想都是一致的,只是用不同的语言工具表达出来,或者说不同的语言都可以去套用。Github上有个项目整理得不错,顺便做了一系列笔记。上面还有一些测试用例,感兴趣的可直接戳: DesignPatternsPHP@github

在PHP设计模式中,GoF “四人帮”经典的《设计模式》一书中介绍了23种设计模式,基本涵盖了所有设计模式,它将设计模式分成创建型,结构型,行为型三大类型,另外还有其他几种设计模式。GoF中有些没有提到。 Continue reading 全面了解PHP设计模式-创建型结构型行为型

PHP设计模式-服务定位模式 ServiceLocator

在PHP服务定位设计模式(Service Locator)中,抽象层对涉及尝试获取一个服务的过程进行封装。该模式使用一个称为”Service Locator”的中心注册表来处理请求并返回处理特定服务。服务定位器知道如何控制应用程序需要的所有服务。

服务定位模式PHP如何设计:使用ServiceLocator为指定接口注册服务。通过使用接口不用知道它的实现就可以获取服务并在应用的类中使用该服务。而在启动的时候我们就可以注入Service Locator对象。 Continue reading PHP设计模式-服务定位模式 ServiceLocator

PHP设计模式-仓库模式 Repository

PHP仓库设计模式(Repository)是一个位于领域层(Domain Layer)和数据映射层(数据访问层)之间的中介层,它使用类似集合仓库的接口来访问领域对象。Repository 仓库封装了持久化存储在数据库中的对象的集合和对它们的操作,为持久层提供了一种更加面向对象的方式。Repository 同样对应用领域层和数据映射层之间的简洁分离和单向依赖有很大的帮助。

比如这些PHP框架Doctrine 2 的ORM模块: 在Entity 和 DBAL之间就有仓库层调停两者关系并包含获得对象的方法。其他如Laravel框架等。下面是MemoryStorage和Post数据映射层之间的Repository的PHP代码实例: Continue reading PHP设计模式-仓库模式 Repository

PHP设计模式-委托Delegation模式

在PHP委托设计模式(Delegation)中,有一个对象接受请求,同时将请求委托给另一个对象来处理。许多其他的模式,如状态模式策略模式访问者模式本质上就是委托模式的特殊形式。委托模式使得我们可以用聚合来替代继承。

实际场景比如有一个PHP项目任务,团队主管接受需求部门的请求,然后主管委托初级开发工程师去处理完成。PHP示例代码如下:
Continue reading PHP设计模式-委托Delegation模式

PHP设计模式-访问者 Visitor

PHP访问者设计模式(Visitor) 可以让你对某些对象的操作外包给其他对象。它封装了一些施加于某数据结构元素之上的操作。一旦这些操作需要修改,接受这个操作的数据结构可以保持不变。

也可以这样理解:现在有一个由许多对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者Visitor对象;访问者实现了一个拥有一个visit方法的接口,这个方法对访问的对象结构中不同类型的元素作出不同的反应;visitor访问一次,就遍历整个对象结构,每个元素都实施accept方法,同时在每个元素的accept方法中回调访问者的visit方法,从而使访问者得以处理对象结构的每个元素。我们可以针对不同的类型的对象结构元素,设计不同的访问者实体类来完成不同的操作。 Continue reading PHP设计模式-访问者 Visitor

PHP设计模式-模板方法 Template Method

PHP模板方法设计模式 (Template Method) 是一种行为设计模式,指在操作中定义一套算法的骨架/模板,将一些步骤延迟到子类中。模板方法子类重新定义算法的特定步骤之后,不会对主算法的结构造成影响。

它的中心思想是让抽象模板的子类“完成”整个算法。这很类似于PHP框架的库。用户需要实现相关的子类才能使程序进行工作。将子类放在不同的模板中进行重用也可以减少不必要的复制粘帖,也很容易就可以解耦实体类。

// 抽象模板类
abstract class Journey Continue reading PHP设计模式-模板方法 Template Method

PHP设计模式-策略模式 Strategy

PHP策略设计模式(Strategy) 定义一组的算法,把每一个算法封装到实现同一接口的不同的独立类中,从而使它们可以快速切换。这种策略设计模式使得算法可以在不影响到客户端的情况下发生变化。这也是除了通过继承抽象类之外实现多样性类的一种不错的选择。

应用场景比如对一系列的对象的排序,一种策略是根据时间,其他策略还有根据id等其他条件。PHP项目开发环境切换如生产环境还是开发环境。下面是根据日期或id进行对象比较的PHP代码示例: Continue reading PHP设计模式-策略模式 Strategy

PHP设计模式-状态模式 State

PHP状态设计模式(State)允许一个对象在其内部状态发生改变时改变它的行为。一个对象的行为取决于一个或多个动态变化的属性,动态变化的属性叫做状态,这种对象则叫做有状态的(stateful)对象。从对象本身来说,PHP状态设计模式就是根据对象的状态不同用相同的事务流程来封装对象不同的行为。这样在项目中就可以不用写大量的条件语句,用更简洁的代码就可以实现对象不同的行为。

比如下面的PHP示例代码,根据订单状态的不同来决定如何处理订单。不同的行为具有相同的方法名,封装在不同的对象中。 Continue reading PHP设计模式-状态模式 State

PHP设计模式-规格模式 Specification

PHP规格设计模式(Specification)可以认为是组合模式的一种扩展。有时项目中某些条件决定了业务逻辑,这些条件就可以抽离出来以某种关系进行组合,从而灵活地对业务逻辑进行定制。另外,在查询、过滤等应用场合中,通过预定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句来处理,可以简化整个实现逻辑。

这里的每个条件就是一个规格specification,多个规格/条件通过串联的方式以某种逻辑关系形成一个组合式的specification。

// 规格接口
interface SpecificationInterface Continue reading PHP设计模式-规格模式 Specification