PHP 设计模式【单、工、注、适、策、观】 先简单写6个

#PHP 设计模式

# 1 单例 模式 4私1公 应用场景:数据库连接 只需要实例化一次

class Single{
private static $num = 0; # 私有化静态属性
private static $instance = null; # 私有化静态属性
private function __construct(){} #禁止外部被实例化
private function __clone(){} # 禁止被克隆
private function __wakeup(){} # 禁止被重建
public static function getInstance(){ # 提供外部唯一访问入口
return self::$instance ?: new self();
}
public function test(){ # 测试函数
echo self::$num ++;
}
}
$single = Single::getInstance();
$single->test();
$single->test();
$single->test();
$single->test();
$single->test();
$single->test();

# 工厂模式
# 如果以后更换类名,不需要在每一个调用他的方法里面改, 只需要改 Factory 里面实例化的类名就行
class worker{
public static function work(){
echo '上班';
}
}

class Factory{
public static function createWorkerFactory(){
return new worker();
}
}
$worker = Factory::createWorkerFactory();
$worker::work();

# 注册树模式
// 把类信息 塞到数组里面, 用的时候可以直接从数组取, 不想用了,就 unset数组 销毁掉
// laravel 底层里面用的多【eg:容器里面的服务绑定基本上都是】,这里就不举例了


# 适配器模式 其实也就是接口 interFace # 应用场景: 为后面实现这个接口的类 规定统一标准 【即一样的函数名】
interface Model{
public function connect();
public function query();
public function close();
}
class MySQL implements Model{
public function connect(){
echo 'MySQL 连接';
}
public function query(){
echo 'MySQL 查询';
}
public function close(){
echo 'MySQL 关闭';
}
}

class MongoDB implements Model{
public function connect(){
echo 'MongoDB 连接';
}
public function query(){
echo 'MongoDB 查询';
}
public function close(){
echo 'MongoDB 关闭';
}
}


# 策略模式
# 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境 也算是适配器模式的延伸 应用场景: 数据库驱动切换 缓存驱动切换
class Driver{
protected $driver;
public function selectDriver(Model $model){
$this->driver = $model;
}
public function modelInfo(){
$this->driver->connect();
$this->driver->query();
$this->driver->close();
}
}
$driver = new Driver();
$driver->selectDriver(new MySQL);
$driver->modelInfo();
$driver->selectDriver(new MongoDB);
$driver->modelInfo();


# 观察者模式
# 观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新 应用场景:队列 一直生产 然后统一消费
interface consume{
public function pop(); # 这里就是在消费发生后要执行的逻辑
}
class Queue{
private $observers = [];
public function push(Consume $consume){ #一直生产
$this->observers[] = $consume;
}
public function pop(){ # 统一消费
foreach ($this->observers as $observer){
$observer->pop();
}
$this->observers = [];
}
}

class ShopOrder implements Consume{
public function pop(){
echo '商城订单出队';
}
}

class TuanOrder implements Consume{
public function pop(){
echo '拼团订单出队';
}
}

$queue = new Queue;
$queue->push(new ShopOrder);
$queue->push(new ShopOrder);
$queue->push(new ShopOrder);
$queue->push(new ShopOrder);
$queue->push(new TuanOrder);
$queue->push(new TuanOrder);
$queue->push(new TuanOrder);
$queue->pop();

posted on 2021-04-07 11:56  刷哥  阅读(121)  评论(0编辑  收藏  举报

导航