1、zixue.it 燕十八精品PHP教程,面向对象与设计模式-教你写出优雅的代码,zixue.it 燕十八精品PHP教程,学习设计模式的意义设计模式概念先说多态简单工厂模式工厂方法模式单例模式观察者模式职责链模式策略模式装饰模式适配器模式桥接模式,学习目录,zixue.it 燕十八精品PHP教程,学习设计模式的意义1:更深入的理解面向对象的思想.2:有利于开发出扩展性强的程序3:面试时的重要考察方面,1:学习设计模式的意义,zixue.it 燕十八精品PHP教程,在软件开发过程中,经常出现的典型场景的典型解决方案,称为设计模式,2:设计模式的概念,生活中也有很多设计模式:象棋招法,泡妞思路,电影
2、悬疑等等,zixue.it 燕十八精品PHP教程,2.1:动手造几个设计模式,典型场景: 同学聚会典型问题: 问你工资典型解决: ?,典型场景: QQ,屌丝,女神典型问题: 女神,还没睡?典型解决: ?,如何学习设计模式?典型场景-典型问题-典型解决办法,zixue.it 燕十八精品PHP教程,3:先说多态,为什么先说多态?答: 多态相对封装与继承,理解稍微复杂一些. 更重要的是, 通过PHP,Java多态的不同体现,体会静态语言与动态语言的巨大差异 -而这个差异巨大,影响到设计模式.对于动态语言,不可照搬java,C+中的设计模式,zixue.it 燕十八精品PHP教程,3.1:多态,多态(
3、Polymorphism) 是一个生物学上的概念,指同一特种的多种表现形态.如:西伯利亚虎一般重210-260公斤,而孟加拉虎一般180-230公斤在面向对象中,指某种对象实例的不同表现形态.多态特点,在静态语言中体现的更为明显.,zixue.it 燕十八精品PHP教程,3.2:老虎爬树,如不明,可看多态详细讲解:http:/www.zixue.it/article-122-1.html,西伯利亚虎不能爬树孟加拉虎可以爬树那么老虎,到底能否爬树?请看java与PHP演示体会静态与动态的巨大差异,zixue.it 燕十八精品PHP教程,4:简单工厂模式 Factory,zixue.it 燕十八精
4、品PHP教程,4.1:分析问题,代码执行没问题,调用没问题!但是:你(客户端,调用者)怎么知道我有个DBmysql类, 和 DBMysqli类?,1:客户端应该只看到接口,不应该知道接口的实现.体现封装隔离原则.2:无论客户端,而是后端,都依赖于抽象接口,而非依赖于具体,zixue.it 燕十八精品PHP教程,4.2:解决问题,添加一个工厂,由工厂负责创造对象,并返回,zixue.it 燕十八精品PHP教程,4.3:用简单工厂后,zixue.it 燕十八精品PHP教程,4.4:用简单工厂的真正意义,看似仅仅是把创建对象的过程包装了一下,真正的变化在于面向接口,隔离封装,客户端只知接口,不知具体
5、实现.后端的实现,只知接口,不管前端谁调用,zixue.it 燕十八精品PHP教程,4.5:简单工厂需改进之处,如果新增PDO方式,是否还要改Factory?修改if/else分支?违反开闭原则.另:这个工厂如果分支足够多,能帮你创建所有的类,形成万能工厂,面向对象设计中,不推荐一个类的功能过多.我们可以把有相关关系的产品交由一个工厂生产,zixue.it 燕十八精品PHP教程,1988年,勃兰特梅耶(Bertrand Meyer)在他的著作面向对象软件构造(Object Oriented Software Construction)中提出了开闭原则,它的原文是这样:“Software ent
6、ities should be open for extension,but closed for modification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。通俗的说: 添加新类/接口等进来行,修改不行.,开闭原则,zixue.it 燕十八精品PHP教程,5.0:工厂方法 Factory Method,工厂方法中,一个工厂生产多个零件,但零件的共同特点是-属于一个产品.即 此工厂可以生产产品,而非单独的对象,zixue.it 燕十八精品PHP教程,6:单例模式 singleton 场景回放,zixue.it 燕十八精品PHP教程,6.1:问题-如何确保只制造一个对象?,
7、1:对象的产生,需要new或者clone2:防止产生过多的对象,要防止new和clone3:综上,没有对象时,允许new,并把对象缓存. 下次直接返回该对象,zixue.it 燕十八精品PHP教程,6.2:解决效果,zixue.it 燕十八精品PHP教程,6.3:模式解析,1:我学java时听说有懒汉式和饿汉式单例模式答:PHP的属性不支持表达式,不支持饿汉式2:php的单例,仅指进程中单例,不似java,在整个内存中单例,zixue.it 燕十八精品PHP教程,7:观察者模式 Observer,zixue.it 燕十八精品PHP教程,7.1:一般的思路,1:判断选中的值2:顺序下来,根据值,
8、修改内容区域3:再修改广告区域.if(v = 男) 内容区背景变灰 广告区内容变成男人话题 else if(v = 女) 内容区背景变粉 广告区内容变成女人话题,问题在哪儿?1:让你选择时引起3个区域的变化,是否要修改if/elseif部分2:如果选择女性样式,但不要变粉,现在流行变紫色,是否又要修改if elseif部分?问题在于: 控制逻辑与被操作对象耦合严重.,zixue.it 燕十八精品PHP教程,7.2:解决办法,我们让div对象观察select的变化,select变化,就会通知道这两个对象.并引起这2个对象的变化,实现观察者模式,zixue.it 燕十八精品PHP教程,7.3:解决
9、效果,select对象负责attach,detach,notifyObservers,与具体的对象变化解耦,zixue.it 燕十八精品PHP教程,8:职责链模式 chain of resionbility,zixue.it 燕十八精品PHP教程,8.1:一般做法,POST发送数据,PHP接收到数据,判断举报的级别.if(粗口) 启动转发给版主的流程 else if(黄赌毒) 启动转发给管理员的流程 else 启动转发给公安的流程,问题在哪儿:1:如果新增了举报级别,要改if else 代码段.2:如果流程内部有改动,也要到if else 代码段来操作.总结:逻辑与执行操作的对象耦合严重.,z
10、ixue.it 燕十八精品PHP教程,8.2:解决办法-职责链模式,版主,管理员,公安,每个对象,储存着对自己上级的引用,如果自己处理不了,交给上一级.,zixue.it 燕十八精品PHP教程,8.3:解决之后-职责链模式,如下,只需要提交给版主即可,版主处理不了,会自动提交给上一级,直到处理完毕.,zixue.it 燕十八精品PHP教程,9:策略模式,zixue.it 燕十八精品PHP教程,9.1:一般的思路,根据传递的参数不同,进行加减乘除运算,思考: 如果想增加取模运算又如何操作?想一想简单工厂方法,是否有些相似? 又有哪些不同?通过接口,隔离封装通过继承,适应变化,工厂模式,我们着眼于
11、得到对象,并操作对象,策略模式,我们着重得到对象某方法的运行结果,zixue.it 燕十八精品PHP教程,9.1:策略的实现 strategy,context对象持有计算对象并计算结果直接返回,zixue.it 燕十八精品PHP教程,10:装饰器模式 decorator,这是一篇帖子帖子的内容我写好了, 三个部门的人员想控制他.编辑组要添导读文字审核组要去敏感字市场部想在末尾加点广告我只是一篇帖子,由你们来处置吧,分析:三部分都操作该文章,最先是编辑组,继承该文章并添加了导读方法审核组来了,继承了该文章,添加去敏感字方法市场部,继承该文章,添加广告方法.继承的层次越来越深能否不继承,动态的增加对象的功能?,zixue.it 燕十八精品PHP教程,10.1:引入装饰器模式,