优秀的程序代码应具备的条件
设计模型定义
设计模式种类示例
策略模式------行为型
策略模式示例:
注:需要为将文件导出为如txt、csv等文件格式,未用策略模式前,如果要新增导出的文件格式,则需要修改导出类本身,会影响到已经在用代码,增加测试成本及出BUG的风险,采用策略模式后,将导出的文件每个格式写一个类,然后将文件类作为参数传到导出类本身,这样,新增导出格式时,不需要对原来的代码进行修改,减少已经在用的代码出BUG的风险;
观察者模式------行为型
注:观察者模式,如定义一个登录的类,并将该登录类定义为被观察者,该类里基础的方法需要有三个 ,一个为增加观察者对象,另一个删除观察者对象,最后一个为通知观察者对象,这样每次有人登录时,都会遍历观察者对象(观察者如安全验证类、日志类等),让观察者对象自身进行更新;观察者模式的主要目的就是解耦,将非核心的逻辑移动到外面的其它类里;
php中对观察者模式的内部支持:
装饰者模式------结构型
需求示例:游戏地图,有一个基类Tile,在此基础上创建的平原Plains继承自该基,、有钻石的平原、被污染的平原都是继承自平原类,此时,如果要创建一个既有钻石又被污染平原时,这种继承的方法就不好使;
装饰者模式改进示例:
注:装饰者TileDecorator和被装饰者Plains都是继承自同一个父类Tile,钻石平原类及污染平原类均继承自装饰者类TileDecorator,装饰者类会将传递进来的类对象保存到tile属性中,实例化时,创建钻石地块时,传进去的参数为平原对象,而创建污染且带钻石的平原时,可以如上图所示,将钻石平原的对象实例传到污染平原类中,也可将污染平原的实例传到钻石平原的类里;
单例模式------创建型
注:单例模式主要特点之一是,需要将构造函数设置成private的私有,让该类不能在外部创建实例(如new方法),另外一个主要特点是该类需要有一个可以从外部访问并获取类实例的public公共方法,该方法,会先判断是否已经有该类的实例了,有的话就直接返回实例对象,没有的话就先创建一个实例后,再返回实例对象;php的单例模式中,还需要将保存类本身的属性及用于克隆对象的方法__clone私有化,加上构造函数,即三私一公;
适配类模式------结构型
代码示例:
注:适配器模式用于,需要复用旧的代码类,且需要在旧的代码类的基础上进行扩展的情形,创建的适配器类,在构造函数里先将旧的类保存到私有属性中,并按需求返回旧类的方法,最后,在适配类本身里实现扩展的方法;
工厂模式------结构型
工厂模式下,通过工厂类,可以将不同的参数实例化成不同的类,例如一个mysql的连接工厂类,可以通过传进类里的host,username,passwd从而得到不同服务器下mysql连接的实例;工厂模式经常用其它设计模式一起使用;
class CDFactory{ public static function create($type) { $class = strtolower($type) . "CD"; return new $class; } } //通过传入不同的参数来实例化不同的对象;统一在工厂类中进行实例化 $type = 'enhanced';$cd = CDFactory::create($type); $type = '';$my_cd = CDFactory::create($type)
组合模式------结构型
示例:
注:如上图示例,军队类是由射手类和加农炮类等战斗单类组成的,军队中可以添加和删除其它战斗单位类;组合模式中,每一个单元(射手类、加农炮类)及由单元组合而成的整体(军队类)都有一个相同的方法(obmbardStrength,返回类的战斗力);
外观模式------结构型
示例:
注:上图示例中,Computer类就是CPU类、Memory类、Disk类的外观;
责任链模式------行为型
注:责任链模式是指将多个类组合一个链条,并且将上一个类的结果传递到一下类里进行处理,直到链条有一个类可以处理传递进来的任务为止;例如,membercache和mysql两个连接类组一个链条,查询数据时,先到membercache里进行查找,有的话就直接返回,没有的话就将查询任务转到mysql处理;