单例模式
- $_instance 必须申明为静态的是有变量
- 构造函数和析构函数必须申明为私有,防止外部程序new类从而失去单例模式的意义
- getInstance() 方法必须设置为共有的,必须调用此方法,以返回实例的一个引用
- 私有的__clone()方法防止克隆对象
<?php
class SingletonMode
{
//静态化 私有 变量
private static $_instance;
//私有化 构造函数
private function __construct()
{
}
//私有化 析构函数
private function __destruct()
{
// TODO: Implement __destruct() method.
}
//私有化 克隆函数
private function __clone()
{
// TODO: Implement __clone() method.
}
// 静态 公共 方法
public static function create()
{
if (!self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
}
工厂模式
工厂模式,工厂方法或者类生成对象,而不是在代码中直接new
使用工厂模式,可以避免当改变某个类的名字或者方法后,在调用这个类的所有的代码中都修改它的名字或者参数
<?php
/**
* Class Mode3
*/
class Mode3 {
public function __construct()
{
echo "I'm Model 3!!!\r\n";
}
}
/**
* Class ModelY
*/
class ModelY {
public function __construct()
{
echo "I'm Model Y!!!\r\n";
}
}
/**
* Class Factory
*/
class Factory
{
/**
* @return Mode3
*/
public function createMode3()
{
return new Mode3();
}
/**
* @return ModelY
*/
public function createModeY()
{
return new ModelY();
}
}
注册模式
注册模式,解决全局共享和交换对象,已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可,将对象注册到全局的数组上,任何地方可以直接去访问
<?php
/**
* Class Register
*/
class Register
{
/**
* @var 全局数组
*/
protected static $arr;
/**
* @desc 设定对象
* @param $key
* @param $obj
*/
public static function set($key, $obj)
{
self::$arr[$key] = $obj;
}
/**
* @desc 获取对象
* @param $key
* @return mixed
*/
public static function get($key)
{
return self::$arr[$key];
}
/**
* @desc 删除对象
* @param $key
*/
public static function remove($key)
{
unset(self::$arr[$key]);
}
}
适配器模式
描述:将各种不同的函数接口封装成统一的API
场景:PHP的数据库连接方式有多种MySQL、MySQLI、PDO,可以用适配器统一,适用不同的数据库操作,封装成一个统一的API,类似场景还有cache适配器,可以将memache、redis、file、apc等不同的缓存,统一成一致的
实现方式:首先定义一个借口,然后有几种不同的情况,就写几个类实现借口,
<?php
interface Db
{
function connect();
function query();
}
class Adapter implements Db
{
private $adapter;
public function __construct($obj)
{
$this->adapter = $obj;
}
public function connect()
{
$this->adapter->connect();
}
public function query()
{
$this->adapter->query();
}
}
class MySQL_mysql implements Db
{
protected $conn;
public function connect()
{
echo "I'm MySQL connect!!!\r\n";
}
public function query()
{
echo "I'm MySQL query!!!\r\n";
}
}
class MySQL_mysqli implements Db
{
protected $conn;
public function connect()
{
echo "I'm MySQLi connect!!!\r\n";
}
public function query()
{
echo "I'm MySQLi query!!!\r\n";
}
}
class MySQL_pdo implements Db
{
protected $conn;
public function connect()
{
echo "I'm MySQL_PDO connect!!!\r\n";
}
public function query()
{
echo "I'm MySQL_PDO query!!!\r\n";
}
}
$a = new MySQL_mysql();
$b = new MySQL_mysqli();
$c = new MySQL_pdo();
$adapter = new Adapter($a);
$adapter->connect();
$adapter->query();
$adapter = new Adapter($b);
$adapter->connect();
$adapter->query();
$adapter = new Adapter($c);
$adapter->connect();
$adapter->query();
策略模式
策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境
使用场景:电商网站根据用户类型,推荐展示不同的类目、商品信息
<?php
interface UserStrategy
{
function showCate();
function showInfo();
}
class MaleUser implements UserStrategy
{
public function showCate()
{
echo "show male cate!!!\r\n";
}
public function showInfo()
{
echo "show male info!!!\r\n";
}
}
class FemalUser implements UserStrategy
{
public function showCate()
{
echo "show female cate!!!\r\n";
}
public function showInfo()
{
echo "show female info!!!\r\n";
}
}
class Page
{
public $strategy;
public function setStrategy($obj)
{
$this->strategy = $obj;
}
public function show()
{
$this->strategy->showCate();
$this->strategy->showInfo();
}
}
$page = new Page();
$type = 'male';
if ($type == 'male') {
$strategy = new MaleUser();
} else if ($type == 'femal') {
$strategy = new FemalUser();
}
$page->setStrategy($strategy);
$page->show();
观察者模式
描述:当一个对象状态发生变化时,依赖它的对象全部收到通知,并自动更新
场景:一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在时间得代码之后直接加入处理的逻辑,当更新的逻辑增多之后,代码会变的难以维护,这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码,观察者模式实现了低耦合,非侵入式的通知和更新机制。
<?php
/**
* @desc 观察者
* Class Observer
*/
interface Observer
{
function update();
}
class Event
{
private $observers = [];
public function addObserver(Observer $observer)
{
$this->observers[] = $observer;
}
public function notify()
{
foreach ($this->observers as $observer) {
$observer->update();
}
}
public function trigger()
{
echo "Event trigger!!!\r\n";
}
}
class Observer1 implements Observer
{
public function update()
{
echo "observer1 update\r\n";
}
}
class Observer2 implements Observer
{
public function update()
{
echo "observer2 update\r\n";
}
}
$event = new Event();
$event->addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->trigger();
$event->notify();
控制反转
层层的依赖关系,反转到调用的起点。通过调整注入的对象,来控制程序的行为
<?php
//传统依赖写法
class A {
public function action()
{
echo "class A\r\n";
}
}
class B {
public function action()
{
$a = new A();
$a->action();
}
}
class C {
public function action()
{
$b = new B();
$b->action();
}
}
//传统依赖写法
$c = new C();
$c->action();
//控制反转模式
class NewA {
public function action()
{
echo "class newA\r\n";
}
}
class NewB {
public $obj;
public function __construct(NewA $a)
{
$this->obj = $a;
}
public function action() {
echo "class newB\r\n";
$this->obj->action();
}
}
class NewC {
public $obj;
public function __construct(NewB $b)
{
$this->obj = $b;
}
public function action()
{
echo "class newC\r\n";
$this->obj->action();
}
}
$obj = new NewC(new NewB(new NewA()));
$obj->action();
装饰器
描述:装饰器模式,可以动态地添加修改类的功能
<?php
/**
* 装饰器接口
* Interface Decorator
*/
interface Decorator
{
public function before();
public function after();
}
class Color implements Decorator
{
public function before()
{
echo "Color before\r\n";
}
public function after()
{
echo "Color after\r\n";
}
}
class Size implements Decorator
{
public function before()
{
echo "Size before\r\n";
}
public function after()
{
echo "Size after\r\n";
}
}
class Show
{
public $decorator = [];
public function addDecorator(Decorator $decorator)
{
$this->decorator[] = $decorator;
}
public function before()
{
foreach ($this->decorator as $item) {
$item->before();
}
}
public function after()
{
foreach ($this->decorator as $item) {
$item->after();
}
}
public function index()
{
//before
$this->before();
//核心处理
echo "Show index\r\n";
//after
$this->after();
}
}
$show = new Show();
$show->addDecorator(new Color());
$show->addDecorator(new Size());
$show->index();
网友评论