书中关于设计模式的介绍很详细。

一、单例模式

作者建了一个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
}
?>

最新文章

  1. form表单的属性标签和练习
  2. 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)
  3. 原生JS常用代码汇总
  4. 使用Struts2搭建登录注册示例
  5. 拥抱HTML5 — Page Visibility(页面可见性) API介绍
  6. 提示reg不是批处理命令怎么办
  7. 配置Entity Framework连接Sql Server出现的一个异常
  8. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
  9. 111. Minimum Depth of Binary Tree
  10. KVM通过qemu实现USB重定向
  11. 关于利用动态代理手写数据库连接池的异常 java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection
  12. Android Studio开发环境部署
  13. vc 获取当前时间
  14. Linux入门之常用命令(4)vi编辑器
  15. php之微信公众号发送模板消息
  16. pywin32安装教程
  17. IDEA中Git更新合并代码后,本地修改丢失
  18. String.IsNullorEmpty()方法的使用
  19. Ubuntu16.04下的modules模块编译加载
  20. MySQL chartset

热门文章

  1. Oracle中“行转列”的实现方式
  2. Linux学习笔记(6)Linux常用命令之帮助命令与用户管理命令
  3. SQL连接查询、变量、运算符、分支、循环语句
  4. 【spring】 &lt;tx:annotation-driven /&gt; 的理解 【转载的】
  5. flv文件格式解析!!!
  6. c语言二维数组传递
  7. HTML head表头添加meta设置
  8. java中HashMap详解
  9. Codeforces Round #375 (Div. 2) - C
  10. 理解是最好的记忆方法 之 CSS中a链接的④个伪类为何有顺序