常用设计模式(php实现)

1、单例模式

单例模式是为了实现在整个项目中只创建一个实例对象的设计模式,最常见的如数据库连接对象。

<?php
class Single{
    // 用于判断是否为同一对象
    public $ran;
    // 用于存储已创建的对象
    static protected $ins=null;
    // 防止直接new 生成对象
    final protected function __construct(){
    	$this->ran = rand(0,999);
    }
    // 防止克隆
    protected function __clone(){}
    // 创建对象唯一接口
    static public function getInstance(){
        if (self::$ins == null) {
            self::$ins=new self();
        }
        return self::$ins;
    }
}

$single1 = Single::getInstance();
var_dump($single1);
$single2 = Single::getInstance();
$single2->ran = 111111;
var_dump($single1);
var_dump($single2);

// $single3 = new Single();
// var_dump($single3);
// $single4 = clone $single1;
// $single4->ran = 1234;
// var_dump($single4);

// var_dump($single1);
// var_dump($single2);
// var_dump($single3);
// var_dump($single4);

?>

关键点在于私有的构造方法、克隆方法、静态属性和公有的静态方法(防止new和clone生成对象)。

代码实现:

<?php
class Single{
    // 用于存储已创建的对象
    static protected $ins=null;
    // 防止直接new 生成对象
    final protected function __construct(){}
    // 防止克隆
    protected function __clone(){}
    // 创建对象唯一接口
    static public function getInstance(){
        if (self::$ins == null) {
            self::$ins=new self();
        }
        return self::$ins;
    }
}
$single1 = Single::getInstance();
?>


2、工厂模式

使用工厂方法生成对象,在类发生变化后只需要修改工厂方法就可以实现全部修改。如果是直接new生成对象,则需要对每次调用new生成方法进行修改。

代码实现:

<?php
// 需要使用工厂方法的类
class Test{
	public function sayHello(){
		var_dump(__FILE__);
	}
}
// 工厂方法
class Factory{
	static public function getTest(){
		return new Test();
	}
}

Factory::getTest()->sayHello();
?>

3、观察者模式

观察者模式用于:当被观察者属性变化或者执行某些操作时,观察者会收到通知并进行相应操作。

观察者模式的优点是利于构建低耦合性的架构。

主要步骤:

1、被观察对象实现注册观察者的方法;

2、被观察对象实现通知方法;

3、观察者实现响应方法;

代码实现:

<?php
// 被监视对象 人
class People{
    protected $_observer = array();
    public function addObserver($observer){
        $this->_observer[] = $observer;
    }
    // 被监视的动作 主人回家
    public function goHome(){
        // 通知响应动作
        foreach ($this->_observer as $observer) {
            $observer->changeHome();
        }
    }
}

// 观察者 狗
class Dog {
    // 监视到变化,所做的动作
    public function changeHome(){
        echo "变乖,出门相迎";
        echo "<br>";
    }
}

$people1 = new People();
$people1->addObserver(new Dog());
$people1->goHome();
?>

以上代码已经实现了最基本的观察者模式,但有的时候观察者不仅只有一个,为了便于组织代码,所以引入接口和抽象类。

代码实现:

<?php
// 观察者 接口
interface Observer{
    // 观察者 响应 变化
    public function respond();
}

// 被观察者 抽象类
abstract class EventGenerator{
    private $_observers = array();
    // 注册观察者
    function addObserver(Observer $observer){
        $this->_observers[]=$observer;
    }
    // 通知被观察者
    function notify(){
        foreach ($this->_observers as $observer){
            $observer->respond();
        }
    }
}

// 被监视对象 人
class People extends EventGenerator{
    // 主人回家 通知观察者
    public function goHome(){
        $this->notify();
    }
}

// 观察者 狗
class Dog implements Observer{
    // 监视到变化,所做的动作
    public function respond(){
        echo "变乖,出门相迎";
        echo "<br>";
    }
}

// 观察者 猫
class Cat implements Observer{
    public function respond(){
        echo "变乖,撒娇";
        echo "<br>";
    }
}

$people1 = new People();
$people1->addObserver(new Dog());
$people1->addObserver(new Cat());
$people1->goHome();
?>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值