PHP设计模式理解
来源:互联网 发布:安卓源码编译环境搭建 编辑:程序博客网 时间:2024/05/06 18:25
一听别人用了什么什么设计模式,总感觉多么高大上似得。其实仔细理解起来,会发现你自己平时敲代码的时候有很多的思路原则,也正式某些设计模式中所要达到的思想。无非是前人开发中碰到的问题时,不利于继续开发维护,从而想出的最佳解决方案,久而久之便形成了公认的固有写代码的开发模式。
个人感觉,其目的大多是为了 可维护性,可扩展性,可复用性而服务,一切的目的则是减少项目开发中的成本与困难度。
下边是自己的一些关于设计模式的通俗的理解,比较山野 随意化,希望能从另一个方面帮助理解。
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模,注册模式
本文先涉及如上绿色10种设计模式。
1.单例模式【创建型】:使某个类的对象仅允许创建一次
单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式的要点有三个:
- 一是某个类只能有一个实例;
- 二是它必须自行创建这个实例;
- 三是它必须自行向整个系统提供这个实例。
为什么要使用PHP单例模式
- 1. php的应用主要在于数据库应用, 一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源,还可以减少数据库连接这样就不容易出现too many connections情况。
- 2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。
- 3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
抽象工厂类 -》多个具体工厂类-》一个具体产品类 然后客户端多个new调用即可
对于修改是封闭的,对于扩展是开放的
想添加新接口,服务端新加具体工厂类,具体产品类,客户端new就行了【实现了服务端不修改,可扩展】
抽象工厂类-》多个具体工厂类-》common类(含参数) 然后客户端new一个common类传参即可
想添加新接口,服务端新加具体工厂类,common中修改添加,客户端还是new common类,只是换个参数【违背了服务端不修改原则】
比如自己写的API,调用相同类的不同参数,获得不同方法的结果值,但是破坏了 对于修改是封闭的,对于扩展是开放的, API这种方式想要拓展,需要改入口函数的,
工厂模式区别.md 【本质就是,简单工厂模式,遵循不修改,可扩展。让客户端省事了,减少了new的次数传参数就行】
单例模式保证了一个类中只有一个实例被全局访问,当你有一组全局对象被全局访问时可能就需要用到注册者模式 (registry),
它 提供了在程序中有条理的存放并管理对象 (object)一种解决方案。一个“注册模式”应该提供get() 和 set()方法来存储和取得对象(用一些属性key)而且也应该提供一个isValid()方法来确定一个给定的属 性是否已经设置。
观察者模式.md 官方代码: http://www.php.net/manual/zh/class.splsubject.php
当一个对象发生改变时, 依赖他的对象全部会收到通知,并自动进行相应操作
6.责任链模式【行为型】:【就是一层一层new,根据责任权来if判断是否本类处理 】
7.策略模式【行为型】【和简单工厂类似,就是switch case 部分换成 虚拟的类,用变量动态化类型从而实现各个拓展功能】 缺点:一个事件发生后,要执行一连串更新操作。传统的编程方式:时间代码后边直接加入处理逻辑,当更新的逻辑增多后,代码变得难以维护。耦合度高,增加新逻辑需要修改事件 主题代码
6.责任链模式【行为型】:【就是一层一层new,根据责任权来if判断是否本类处理 】
特点:有两个成员属性,power权的大小,top下一级别权的类名,
上来先if判断传入的权是否大于奔雷的power,大于的话else实例化下一级别的类,同上操作
缺点:当权值较大时,必须把权小的一步一步都实例化(类似于从村,镇,乡,市..一步一步办事情,大事得高级部门办)
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法。
关键:$this->classname = $classname;($classname是用户实例化时传过来)
$this->classname->common_method($cal1,$cal2);(参数也是传过的 ,红字是关键,从原来每个得写出来变为变量,与简单工厂的区别 也再此)
装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能。传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多。
笨办法:写一个基础功能,然后想要装饰拓展此功能,一层一层继承,往上装饰,缺点,顺序局限,继承太多
新方法:此模式的诞生,本质是把该对象的资源,作为新对象实例化的构造参数,把上一层对象扔进来,在新类里处理,retun出去,后头同此方法继续,从而达到层层装饰的模式
$baseobj = new obj();
$obj = new obja( new objb( new objc() ) );//循环嵌套,一层一层把修饰的东西积累
$obj->common_method()//通过调用相同的继承父类方法,实现加载
装饰器模式.md
原来的类满足不了所有的接口格式,用一个adapter,来继承这个类,然后在适配器类里对数据处理然后返回
就像日本110V的电压,来的中国220V充电,就得用一个适配器来转接,道理一样。
本质也是要把其中一个对象传入类中,赋值给该类成员属性存储起来,然后再在公共方法调用加上自己的程序并调用
把M * N 的类的结构变成 N + M各类,减少了类的书写
比如 跑,跳,飞 和 小名, 小红, 小刚 正常得写9各类,而桥接只写3+3个类
桥接模式.md
0 0
- PHP设计模式理解
- php 设计模式的理解
- php设计模式自我理解
- PHP耦合设计模式的理解
- 第一篇 理解PHP设计模式
- 个人对于PHP设计模式之工厂模式的理解
- 关于PHP设计模式的分析和理解
- 理解J2EE设计模式
- 设计模式的理解
- 设计模式的理解
- 设计模式理解
- 设计模式的理解
- 初步理解设计模式
- 理解设计模式
- 设计模式 举例理解
- 设计模式理解
- 设计模式理解
- 设计模式理解---之一
- [整理]Svn常见问题汇总。
- 2016.02.16我的上司对我说的一席话
- 二叉查找树
- hdu 5773 The All-purpose Zero
- BZOJ1015: [JSOI2008]星球大战starwar 并查集 离线处理
- PHP设计模式理解
- SpringMVC 注解
- Ubuntu中启用关闭Network-manager网络设置问题!
- 苹果和虫子2
- 二进制文件中的字符串替换
- 每日进步之leetcode15题C++实现代码
- servlet学习
- C++类成员函数作为线程回调函数
- String to Integer (atoi)