读《深入php面向对象、模式与实践》有感(二)
书中关于设计模式的介绍很详细。
一、单例模式
作者建了一个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面向对象、模式与实践》有感(二)的更多相关文章
- 读《JavaScript面向对象编程指南》(二)
第五章 原型 在JavaScript中,所有函数都会拥有一个 prototype 的属性,默认初始值为空对象. 可以在相关的原型对象中添加新的方法和属性,甚至可以用自定义对象来完全替换掉原有的原型对象 ...
- PHP面向对象编程 对象的基本概念 PHP面向对象的基本实践 PHP面向对象的高级实践 PHP面向对象的特殊实践
再次梳理一下面向对象编程的要点. 此文是以php为例,但思想是通用的. 总结的PHP面向对象编程笔记 对象的基本概念 对象的基本构成 对象包含两部分 一.对象的组成元素 是对象的数据模型,用于描述对象 ...
- 【Scrum】-NO.40.EBook.1.Scrum.1.001-【敏捷软件开发:原则、模式与实践】- Scrum
1.0.0 Summary Tittle:[Scrum]-NO.40.EBook.1.Scrum.1.001-[敏捷软件开发:原则.模式与实践]- Scrum Style:DesignPattern ...
- 敏捷软件开发:原则、模式与实践——第11章 DIP:依赖倒置原则
第11章 DIP:依赖倒置原则 DIP:依赖倒置原则: a.高层模块不应该依赖于低层模块.二者都应该依赖于抽象. b.抽象不应该依赖于细节.细节应该依赖于抽象. 11.1 层次化 下图展示了一个简单的 ...
- 敏捷软件开发:原则、模式与实践——第9章 OCP:开放-封闭原则
第9章 OCP:开放-封闭原则 软件实体(类.模块.函数等)应该是可以扩展的,但是不可修改. 9.1 OCP概述 遵循开放-封闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(open f ...
- 我的首个MOOC课程《面向对象软件开发实践》
我的首个MOOC课程<面向对象软件开发实践> 我将在网易云课堂开讲MOOC课<面向对象软件开发实践>(http://mooc.study.163.com/course/YOOK ...
- 敏捷软件开发:原则、模式与实践——第14章 使用UML
第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要 ...
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...
- 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则
第10章 LSP:Liskov替换原则 Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...
- 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则
第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...
随机推荐
- Oracle中“行转列”的实现方式
在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用“行转列”: scott的emp的原始数据为: EMPNO ENAM ...
- JSHint配置详解
Also available on Github JSHint配置详解 增强参数(Enforcing Options) 本类参数设为true,JSHint会产生更多告警. bitwise 禁用位运算符 ...
- Hibernate的持久化类状态
Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态. 瞬时态 transient (临时态):持久化 ...
- loadrunner取出字符串的后面几位
Action() { char *phonenum; int k=1; phonenum=lr_eval_string("{phoneNum}");//参数化获取 ...
- DSP using MATLAB 示例Example3.23
代码: % Discrete-time Signal x1(n) : Ts = 0.0002 Ts = 0.0002; n = -25:1:25; nTs = n*Ts; x1 = exp(-1000 ...
- css整理-02 颜色和字体
颜色 命名颜色 RGB指定颜色 数值: 0-255 百分比 三元组:红绿蓝 16进制RGB web安全颜色 在256色计算机系统上总能避免抖动的颜色 表示为rgb值20%和51的倍数 web安全色的简 ...
- Scau 10327 Biggest Square
时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC Description You are given a M*M cloth wi ...
- S5中新增的Array方法详细说明
ES5中新增的Array方法详细说明 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wor ...
- Spring Integration - 自动轮询发送手机短信
Spring Integration 配置 <?xml version="1.0" encoding="UTF-8"?> <beans xml ...
- Python基础8- 序列
序列是一组有顺序的元素的集合序列的成员是有序排列的且可以通过下标偏移量来访问它的一个或几个成员序列可以包含一个或多个元素,也可以没有任何元素序列有两种类型:列表(list)和元组(tuple),两者的 ...