读《深入php面向对象、模式与实践》有感(二)
2016-03-03 15:19
579 查看
书中关于设计模式的介绍很详细。
一、单例模式
作者建了一个preferences类来解释什么是单例模式。这个preferences类并非我第一次见到,在android中也有这个类,不过以前都是只管用即可,但这次作者在书中用php将这个类重写了一遍。
采取单例模式的类会具有以下几个特点:
1、该类产生的对象可以在系统中的任何地方被使用。
2、在系统中只会产生一个该类的对象
3、无法再创建该类对象而将原有对象覆盖
android中的preferences类就满足上面这几条,用一句话来形容preferences类即:这相当于是一个在系统中的储物柜,你可以在代码的任何一段往里面放东西,然后再后面的任何时候再拿出来,在你的程序执行时该储物柜一直存在(里面的东西也一直存在)。
实现办法:
我们可以从控制preferences类的实例化开始(解决2、3条件),做法是定义一个私有的构造方法即可(因为只要实例化便会运行构造方法,但私有构造方法则表示我们无法从外部调用这个构造方法,也就没法从外部实例化preferences类)。
虽然没法实例化,但我们可以通过静态方法来调用preferences类(这样可以保证我们每次可以不创建新对象依然可以用到preferences类)
代码如下:
单例模式与全局变量相比,它是一种对于全局变量的改进。
二、组合模式
组合模式的用处:如果你想像对待单个对象一样对待多个对象,那么可以使用组合模式。
即假如某一个对象有run()的功能,而其它很多对象都有run()的功能。那么你可以把这些对象自由组合成一个大集合,再“直接使用这些集合的run()功能”。
实现:
如图所示,所有的子类对象都继承Unit父类,而这些子类有两种,一种是普通的子类,只能运行Unit规定的公共方法,另一种子类我称之为“集合子类”,它可以存储普通子类,或其他集合子类,当然也能运行Unit规定的公共方法。
实例代码如下:
一、单例模式
作者建了一个preferences类来解释什么是单例模式。这个preferences类并非我第一次见到,在android中也有这个类,不过以前都是只管用即可,但这次作者在书中用php将这个类重写了一遍。
采取单例模式的类会具有以下几个特点:
1、该类产生的对象可以在系统中的任何地方被使用。
2、在系统中只会产生一个该类的对象
3、无法再创建该类对象而将原有对象覆盖
android中的preferences类就满足上面这几条,用一句话来形容preferences类即:这相当于是一个在系统中的储物柜,你可以在代码的任何一段往里面放东西,然后再后面的任何时候再拿出来,在你的程序执行时该储物柜一直存在(里面的东西也一直存在)。
实现办法:
我们可以从控制preferences类的实例化开始(解决2、3条件),做法是定义一个私有的构造方法即可(因为只要实例化便会运行构造方法,但私有构造方法则表示我们无法从外部调用这个构造方法,也就没法从外部实例化preferences类)。
虽然没法实例化,但我们可以通过静态方法来调用preferences类(这样可以保证我们每次可以不创建新对象依然可以用到preferences类)
代码如下:
class Preferences{ private $box = array(); //用来装需要储存的东西 private static $instance; //这个$instance用来装Preferences类实例化出来的唯一的对象 private function __construct(){} //防止该类被外部实例化 public static function getInstance(){ //外部不用创建对象,也可以通过该静态方法调用该类 if(empty(self::$instance)){ //判断$instance里是否有东西,如果没有则创建一个该类对象放进去 self::$instance = new Preferences(); } return self::$instance;//将该类的对象返回出来,这样运行该静态方法后就相当于得到了Preferences类的对象(接下来就可以对该对象进行操作) } //该方法用于将东西放入Preferences对象的$box数组中 public function setProperty($key,$content){$this->box[$key] = $content; } //该方法用于将东西从Preferences对象的$box数组中拿出来
public function getProperty($key){return $this->box[$key]; }}
单例模式与全局变量相比,它是一种对于全局变量的改进。
二、组合模式
组合模式的用处:如果你想像对待单个对象一样对待多个对象,那么可以使用组合模式。
即假如某一个对象有run()的功能,而其它很多对象都有run()的功能。那么你可以把这些对象自由组合成一个大集合,再“直接使用这些集合的run()功能”。
实现:
如图所示,所有的子类对象都继承Unit父类,而这些子类有两种,一种是普通的子类,只能运行Unit规定的公共方法,另一种子类我称之为“集合子类”,它可以存储普通子类,或其他集合子类,当然也能运行Unit规定的公共方法。
实例代码如下:
<?php
abstract class Unit{ function getComposite(){ //该方法作用:在使用集合对象添加对象前,必须检查正在使用的是否为集合对象(因为普通对象没法添加对象),而所有继承Unit类的对象的getComposite()方法默认返回值为null,只有继承了父类二的“集合对象”的该方法才会“返回当前对象,从而利用当前对象进行增加或移除对象的操作” return null; } abstract function countNum();//公共方法 } abstract class CompositeUnit extends Unit{ private $units = array();//用来放存入的unit对象 function getComposite(){ return $this;//返回当前对象,从而利用当前对象进行增加或移除对象的操作 } protected function units(){ return $this->units;//这样后面的子类可以通过这个方法来调用units数组 } function addUnit(Unit $unit){ if(in_array($unit,$this->units,true)){//检查是否已储存过了, return; } $this->units[]=$unit; } function removeUnit(Unit $unit){ $key = array_search($unit,$this->units); if($key!==false){ array_splice($this->units,$key); } } } class demo1Unit extends Unit{//普通子类1 function countNum(){ return 2; } } class demo2Unit extends Unit{//普通子类2 function countNum(){ return 4; } } class demoComposit extends CompositeUnit{//集合子类 private $units = array(); function countNum(){ $num = 0; foreach($this->units() as $units){ $num += $units->countNum(); } return $num; } } //运行代码 $demo1 = new demo1Unit(); $demo2 = new demo2Unit(); $comDemo = new demoComposit();//创建集合对象 if(!is_null($com = $comDemo->getComposite())){ //先通过对象的getComposite方法来检查$comDemo是否为集合对象,如果是,则会返回当前对象并赋给$com $com->addUnit($demo1); $com->addUnit($demo2); print $com->countNum();//结果为6 }
?>
相关文章推荐
- 读《深入php面向对象、模式与实践》有感(二)
- FTP库BlackRaccoon问题解决方案
- PHP判断数组内容是否都为一样的值
- <php>删除(有内容的)文件夹函数程序
- windows 10下配置 WAMP
- <php>文件操作*(重要)
- php设计模式 观察者模式
- 实时查看及监控PHP-FPM的运行状态
- TP:DD4FAE06 Thanks for TexturePacker
- 基于ThinkPHP+AJAX的省市区三级联动
- PHP环境配置中遇到的问题
- PHP
- ubuntu 下ftp服务的安装与启动
- PHP前后端交互
- [PHP 版] 设计模式目录
- Laravel 学习笔记 ―― 神奇的服务容器
- php概念理解
- php调试
- PHP环境配置中遇到的问题
- PHP限制频繁请求