一听别人用了什么什么设计模式,总感觉多么高大上似得。其实仔细理解起来,会发现你自己平时敲代码的时候有很多的思路原则,也正式某些设计模式中所要达到的思想。无非是前人开发中碰到的问题时,不利于继续开发维护,从而想出的最佳解决方案,久而久之便形成了公认的固有写代码的开发模式。
个人感觉,其目的大多是为了 可维护性,可扩展性,可复用性而服务,一切的目的则是减少项目开发中的成本与困难度。
下边是自己的一些关于设计模式的通俗的理解,比较山野 随意化,希望能从另一个方面帮助理解。
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模,注册模式
本文先涉及如上绿色10种设计模式。
1.单例模式【创建型】:使某个类的对象仅允许创建一次
单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式的要点有三个:
为什么要使用PHP单例模式
1. php的应用主要在于数据库应用, 一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源,还可以减少数据库连接这样就不容易出现too many connections情况。
2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。
鸡肋的PHP单例模式应用详解 http://www.jb51.net/article/37742.htm
2.工厂模式【创建型】:工厂方法或者类生成对象,而不是在服务端中直接 NEW,在客户端端NEW
抽象工厂类 -》多个具体工厂类-》一个具体产品类 然后客户端多个new调用即可
对于修改是封闭的,对于扩展是开放的
想添加新接口,服务端新加具体工厂类,具体产品类,客户端new就行了【实现了服务端不修改,可扩展】
3.简单工厂方法【创建型】,【就是减少NEW次数的】
抽象工厂类-》多个具体工厂类-》common类(含参数) 然后客户端new一个common类传参即可
想添加新接口,服务端新加具体工厂类,common中修改添加,客户端还是new common类,只是换个参数【违背了服务端不修改原则】
比如自己写的API,调用相同类的不同参数,获得不同方法的结果值,但是破坏了 对于修改是封闭的,对于扩展是开放的, API这种方式想要拓展,需要改入口函数的,
工厂模式区别.md 【本质就是,简单工厂模式,遵循不修改,可扩展。让客户端省事了,减少了new的次数传参数就行】
4.注册模式【行为型】:全局共享和交换对象
单例模式保证了一个类中只有一个实例被全局访问,当你有一组全局对象被全局访问时可能就需要用到注册者模式 (registry),
它 提供了在程序中有条理的存放并管理对象 (object)一种解决方案。一个“注册模式”应该提供get() 和 set()方法来存储和取得对象(用一些属性key)而且也应该提供一个isValid()方法来确定一个给定的属 性是否已经设置。
5.观察者模式【行为型】:【就是遍历数组实现一次监听 】
实例化时先把新对象add成员属性的数组,然后执行一个触发器方法,用来遍历刚刚那个数组
观察者模式.md 官方代码: http://www.php.net/manual/zh/class.splsubject.php
当一个对象发生改变时, 依赖他的对象全部会收到通知,并自动进行相应操作
缺点:一个事件发生后,要执行一连串更新操作。传统的编程方式:时间代码后边直接加入处理逻辑,当更新的逻辑增多后,代码变得难以维护。耦合度高,增加新逻辑需要修改事件 主题代码
6.责任链模式【行为型】:【就是一层一层new,根据责任权来if判断是否本类处理 】
特点:有两个成员属性,power权的大小,top下一级别权的类名,
上来先if判断传入的权是否大于奔雷的power,大于的话else实例化下一级别的类,同上操作
缺点:当权值较大时,必须把权小的一步一步都实例化(类似于从村,镇,乡,市..一步一步办事情,大事得高级部门办)
7.策略模式【行为型】【和简单工厂类似,就是switch case 部分换成 虚拟的类,用变量动态化类型从而实现各个拓展功能】
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法。
关键:$this->classname = $classname;($classname是用户实例化时传过来)
$this->classname->common_method($cal1,$cal2);(参数也是传过的 ,红字是关键,从原来每个得写出来变为变量,与简单工厂的区别 也再此)
8.装饰器模式【结构型】
装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能。传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多。
笨办法:写一个基础功能,然后想要装饰拓展此功能,一层一层继承,往上装饰,缺点,顺序局限,继承太多
新方法:此模式的诞生,本质是把该对象的资源,作为新对象实例化的构造参数,把上一层对象扔进来,在新类里处理,retun出去,后头同此方法继续,从而达到层层装饰的模式
$baseobj = new obj();
$obj = new obja( new objb( new objc() ) );//循环嵌套,一层一层把修饰的东西积累
$obj->common_method()//通过调用相同的继承父类方法,实现加载
装饰器模式.md
9.适配器模式【结构型】(接过来旧的,转换成新的格式传给适用的对象)
原来的类满足不了所有的接口格式,用一个adapter,来继承这个类,然后在适配器类里对数据处理然后返回
就像日本110V的电压,来的中国220V充电,就得用一个适配器来转接,道理一样。
10.桥接模式【结构型】
本质也是要把其中一个对象传入类中,赋值给该类成员属性存储起来,然后再在公共方法调用加上自己的程序并调用
把M * N 的类的结构变成 N + M各类,减少了类的书写
比如 跑,跳,飞 和 小名, 小红, 小刚 正常得写9各类,而桥接只写3+3个类
桥接模式.md
简单工厂模式与策略模式区别:
当时我在说明策略模式与工厂模式区别的时候举了一个例子。
说你要去买件衣服,给你50块钱,策略模式的做法就是去京东、当当、淘宝、卓越等网上去看,然后决定要买那一件。而工厂模式的做法确实,告诉系统我需要用50块钱买件衣服,到底他去当当、淘宝、京东、卓越你不关心,你只需要50块钱的一件衣服。淘宝mm一语道出工厂相当于黑盒子,策略相当于白盒子。
简单工厂模式:创造性
策略模式:行为性
//工厂模式
class ProductFactory {
public static function create($num) {
switch($num) {
case 1:
return new ProductA();
case 2:
return new ProductB();
}
return null;
}
}
//传递不同的参数获取不同的对象
$obj=ProductFactory::create(1);
$obj->getName(); //这是A商品
$obj=ProductFactory::create(2);
$obj->getName(); //这是B商品
//=======策略模式
';
}
}
class Bick implements IStrategy {
public function ontheway() {
echo '骑自行车去
';
}
}
class Bus implements IStrategy {
public function ontheway() {
echo '坐巴士去
';
}
}
//策略模式,传递不同的参数,调用不同的策略
class Strategy{
public function getWay(IStrategy $obj) {
$obj->ontheway();
}
}
$obj=new Strategy();
$obj->getWay(new Walk); //走着去
$obj->getWay(new Bick); //骑自行车去
$obj->getWay(new Bus); //坐巴士去