您的位置:首页 > 编程语言 > PHP开发

PHP设计模式理解

2016-07-28 22:58 507 查看
   一听别人用了什么什么设计模式,总感觉多么高大上似得。其实仔细理解起来,会发现你自己平时敲代码的时候有很多的思路原则,也正式某些设计模式中所要达到的思想。无非是前人开发中碰到的问题时,不利于继续开发维护,从而想出的最佳解决方案,久而久之便形成了公认的固有写代码的开发模式。
个人感觉,其目的大多是为了 可维护性,可扩展性,可复用性而服务,一切的目的则是减少项目开发中的成本与困难度。
 下边是自己的一些关于设计模式的通俗的理解,比较山野 随意化

,希望能从另一个方面帮助理解。

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模,注册模式

本文先涉及如上绿色10种设计模式。

1.单例模式【创建型】:使某个类的对象仅允许创建一次

单例模式顾名思义,就是只有一个实例。作为对象的创建模式,
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
 

单例模式的要点有三个:
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。

为什么要使用PHP单例模式

1. php的应用主要在于数据库应用,
一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源,还可以减少数据库连接这样就不容易出现too many connections情况。

2. 如果系统中需要有一个类来全局控制某些配置信息,
那么使用单例式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。

3. 在一次页面请求中, 便于进行调试,
因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。


        鸡肋的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: