[TOC]
## :-: 基本的设计模式
1. 工厂模式
说明:工厂方法或者类生成对象,而不是在代码中直接new
2. 单例模式
说明:使某个类的对象仅允许创建一个
代码:
~~~
class Database
{
private static $db;
private function __construct()//把构造方法定义为私有的,这样在类外就不能通过new关键字来实例化一个类
{
}
static function getInstance()
{
if (self::$db) {
return self::$db;
} else {
self::$db = new self();
return self::$db;
}
}
}
~~~
3. 注册模式
说明:全局共享和交换对象
代码:
~~~
class register
{
private static $objects;
static function set($alias, $object)//把对象挂到注册树上
{
self::$objects[$alias] = $object;
}
static function get($name)//获得注册树上的对象
{
return self::$objects[$name];
}
function _unset($alias)//把对象从注册数上移除
{
unset(self::$objects[$alias]);
}
}
~~~
4. 适配器模式
说明:可以将截然不同的函数接口封装成统一的API
实际应用举例:PHP的数据库操作有mysql,mysqli,pdo3种,可以用适配器模式统一成一致。类似的场景还有cache适配器,将memcache,redis,file,apc等不同的缓存函数,统一成一致的
代码:
~~~
首先:通过实现接口可以实现封装成统一的API
interface IDatabase
{
function connect($host, $user, $passwd, $dbname);
function query($sql);
function close();
}
//mysql的用法,实现接口,统一接口
class MySQL implements IDatabase
{
protected $conn;
function connect($host, $user, $passwd, $dbname)
{
$conn = mysql_connect($host, $user, $passwd);
mysql_select_db($dbname, $conn);
$this->conn = $conn;
}
function query($sql)
{
$res = mysql_query($sql, $this->conn);
return $res;
}
function close()
{
mysql_close($this->conn);
}
}
//mysqli的用法
class MySQLi implements IDatabase
{
protected $conn;
function connect($host, $user, $passwd, $dbname)
{
$conn = mysqli_connect($host, $user, $passwd, $dbname);
$this->conn = $conn;
}
function query($sql)
{
return mysqli_query($this->conn, $sql);
}
function close()
{
mysqli_close($this->conn);
}
}
//pdo的用法
class Pdo implements IDatabase
{
protected $conn;
function connect($host, $user, $passwd, $dbname)
{
$conn = new \Pdo("mysql:host=$host;dbname=$dbname", $user, $passwd);
$this->conn = $conn;
}
function query($sql)
{
return $this->conn->query($sql);
}
function close()
{
unset($this->conn);
}
}
~~~
5. 策略模式
说明:将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式。
实际应用举例:假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有的广告位展示不同的广告。
作用:使用策略模式可以实现Ioc,依赖倒置,控制反转
代码:
~~~
interface UserStrategy
{
function showAd();
function showCategory();
}
class MaleUserStrategy implements UserStrategy
{
function showAd()
{
echo '2019男装';
}
function showCategory()
{
echo '男装';
}
}
~~~
6. 数据对象映射模式
说明:是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。也就是对对象的操作会映射为数据库中的一条记录
实际应用举例:在代码中实现数据对象映射模式,我们将实现一个ORM类,将复杂的SQL语句映射成对象属性的操作。
代码:
~~~
$user = new User2(1);
$user->name = 'test';
$user->mobile = '';
$user->regtime = date('Y-m-d H:i:s');
class User
{
public $id;
public $name;
public $mobile;
public $regtime;
protected $db;
function __construct($id)
{
$this->db = new MySQLi();
$this->db->connect('127.0.0.1','root','123','test');
$res = $this->db->query("select * from user where id='{$id}' limit 1");
$data = $res->fetch_assoc();
$this->id = $data['id'];
$this->name = $data['name'];
$this->mobile = $data['mobile'];
$this->regtime = $data['regtime'];
}
function __destruct()
{
$this->db->query("update user set name = '{$this->name}',
mobile = '{$this->mobile}',regtime = '{$this->regtime}' where id = '{$this->id}' limit 1");
}
}
7. 观察者模式
说明:当一个对象状态发生改变的时,依赖它的对象全部会收到通知,并自动更新
场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码。
作用:观察者模式实现了低耦合,非侵入式的通知与更新机制。
代码:
~~~
abstract class EventGenerator//事件发生者(发生事件)
{
private $observers = array();
function addObserver(Observer $observer)//添加观察者
{
$this->observers[] = $observer;
}
function notify()//通知观察者
{
foreach ($this->observers as $observer)
{
$observer->update();
}
}
}
interface Observer//观察者,观察的对象就是刚才的事件发生者
{
function update($event_info = null);//
}
class Event extends EventGenerator//事件,继承事件发生者
{
function trigger()
{
echo '事件发生<br>/n';
$this->notify();//通知观察者
}
}
$event = new Event();
$event->addObserver(new Observer1);
$event->addObserver(new Observer2);
$event->trigger();
~~~
8. 原型模式
说明:与工厂模式作用类似,都是用来创建对象。与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。原型对象适用于大对象的创建。创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需要内存拷贝即可。
9. 装饰器模式
说明:可以动态的添加修改类的功能。
作用:一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程方式,需要写一个子类继承它,并重新实现类的方法。使用装饰器模式,仅需要运行时添加一个装饰器对象即可实现,可以实现最大的灵活性。
10. 迭代器模式
说明:在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素。相比于传统的编程模式,迭代器模式可以隐藏遍历元素的所需要的操作。
11. 代理模式
说明:在客户端与实体之间建立一个代理对象(proxy),客户端对实体进行操作全部委派给代理对象,隐藏实现的具体实现细节。Proxy还可以与业务代码分离,部署到另外的服务器。业务代码中通过RPC来委派任务。
- PHP操作集合
- 获取字符首字母
- PHP实现定时备份MySQL数据库
- PHP定时发送邮件
- PHP基本语法
- 总结
- 命名空间
- 错误抑制符
- 位运算符
- 原码,反码,补码
- traits
- PHP的反射机制
- const和define的区别
- 语法
- 常用的函数
- 1.变量及打印函数
- 2.引入文件
- 3.常量
- 4.错误处理
- 5.面向对象
- 数据结构与算法
- 结构
- 数组
- 索引
- 散列表(哈希表)
- 栈
- 队列
- 链表
- 算法
- 排序算法
- 插入排序
- 冒泡排序
- 选择排序
- 归并排序
- 快速排序
- 查找算法
- 二分查找
- 二分查找变形版本1:查询数据在序列中第一次出现
- 哈希算法
- 算法复杂度
- Smarty模板引擎
- composer
- yaf
- yaf的安装配置
- 其它
- Java
- JavaSE
- 1.Java发展及JDK安装配置
- 2.Eclipse的下载及安装
- 3.Java开发基础
- 虚拟机
- 2.编辑虚拟机设置
- 1.虚拟机下安装centos
- 3.安装vmtools
- Linux
- 1.vi和vim编辑器
- 2.开机、重启和用户登录注销
- 3.用户管理
- 4.用户组管理
- 5.用户和组的相关文件
- 6.linux运行级别
- 7.帮助指令
- 8.文件目录类指令
- 9.时间日期类
- 10.搜索查找类
- 11.压缩和解压缩
- 12.组管理和权限管理(难点,重点)
- 虚拟主机的配置
- phpstudy快捷配置
- 配置文件配置
- PHP面向对象高级特性
- SPL标准库(PHP标准库)
- PHP链式操作的实现
- 面向对象编程的基本原则
- 设计模式
- 基本的设计模式