我的设计模式系列文章
php设计模式(1)-- 观察者模式 -- spl标准写法
php设计模式(2)-- 观察者模式 -- 用trait来改进的写法
php设计模式(3)-- 责任链(职责链)模式
php设计模式(4)-- 装饰器模式
分析
我们来重新思考一下前面的代码,发现有一个不足,我仅仅是想实现观察者,如果每个想实现观察者的类,都写那么多代码,不太好。
这里我不使用继承,原因:php只允许单继承,如果为了实现观察者模式继承的话,就不能继承别的类了。
于是使用trait来解决,效果棒呆!对于前文的4个文件,修改User.php,再添加一个MySqlSubject.php,这样的话,两个观察者类,和客户端代码无需任何修改,
最终,User类的代码只有他自己的业务逻辑,无关的代码被放到通用类MySqlSubject中,代码十分清爽,且可以重用。
代码
MySplSubject.php
<?php
// 本类是可以通用的
trait MySplSubject {
/**
* @var SplObjectStorage
*/
private $observers = NULL;
private function create_observers(){
if ($this->observers==null) {
$this->observers = new SplObjectStorage();
}
}
public function attach(SplObserver $observer) {
$this->create_observers();
$this->observers->attach($observer);
}
public function detach(SplObserver $observer) {
$this->create_observers();
$this->observers->detach($observer);
}
public function notify() {
$this->create_observers();
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
}
User.php
<?php
class User implements SplSubject {
// 由trait来实现接口
use MySplSubject;
private $email;
private $username;
private $mobile;
private $password;
public function __construct($email, $username, $mobile, $password) {
$this->email = $email;
$this->username = $username;
$this->mobile = $mobile;
$this->password = $password;
}
// 这是业务逻辑
public function changePassword($newPassword) {
echo __METHOD__, PHP_EOL;
$this->password = $newPassword;
$this->notify();
}
// 专门给监听器的信息,也可以省略,然后对每个字段添加get方法
public function get_observer_info(){
return [
"email" => $this->email,
"mobile" => $this->mobile,
"username" => $this->username,
"password" =>$this->password,
];
}
}
效果展示同前文一样:
User::changePassword
向 user1@domain.com 发送电子邮件成功。内容是:你好 张三你的新密码是 654321,请妥善保管
向 手机13610002000 发送短信成功。短信内容是:你好 张三你的新密码是 654321,请妥善保管
分享到:
相关推荐
Laravel开发-artisan-trait-maker 创建特征存根的artisan命令
Laravel开发-laravel-trait-uuid 向雄辩模型添加UUID的大型雄辩模型特征
Laravel开发-trait-maker 创建特征存根的artisan命令
计算机后端-PHP大牛线上培训班课-HP设计模式与Trait技术计模式.mp4
计算机后端-PHP大牛线上培训班课-HP设计模式与Trait技术代码复用.mp4
Laravel开发-laravel-trait-updatedby 向雄辩模型中添加用户ID的大型雄辩模型特征
Laravel开发-eloquent-model-trait 为雄辩模型添加有用的方法
计算机后端-PHP大牛线上培训班课-HP设计模式与Trait技术er安装TP51_Win版.mp4
Laravel开发-trait-maker .zip.zip
Laravel开发-laravel-create-update-trait 创建/更新Laravel 5.4的特征
Laravel开发-laravel-bitwise-trait 在任何类上使用位运算符的简单特性
Laravel开发-validation-trait Laravel的验证特性
Laravel开发-laravel-encryptable-trait Laravel可加密特性,很容易使雄辩模型的某些字段可加密
Laravel开发-laravel-sluggable-trait 您可以应用于雄辩模型的特征,以便在保存时自动生成段塞。
Laravel开发-addressable-trait 将可寻址功能添加到Laravel 5.1雄辩模型的特征。
添加configure(options)方法的特征,该方法将在每个选项键上调用设置器。 安装 npm install cocktail --save npm install cocktail-trait-configurable --save 特性需要(胶水代码) 没有任何 用法 MyClass.js ...
诸如async-trait ,请避免使用Box和dyn 。 您可以在特征中使用异步键盘输入,而无需分配。 感谢crate ,从中提供了一些代码。 警告:此板条箱使用了一些不稳定甚至不完整的功能。 您将从编译器获得一些警告。 ...
如果实现了属性的 getter 方法,则getAccumulated方法将使用它来获取poperty的值。 $args数组将作为参数传递给 getter 方法。 您可以更改通过 1(直接)或 0(反向)第三个参数的累积顺序。 您还可以指定是否只累积...
主要介绍了PHP中用Trait封装单例模式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧