🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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来委派任务。