php 观察者模式 缺点,PHP中的观察者模式 – 不同事件的正确实践

我想知道我对不同事件的Observer模式的实现,例如’userLoggedOut’,’userRegistered’,’userLoggedIn’是否正确,下面是我的简化代码:

的index.php

$login = new \Observer\Observable\Login;

$userData = $login->getData();

$login->attach( new \Observer\Observer\Email );

$login->notify( 'userLoggedIn' );

$login->notify( 'userLoggedOut', $userData );

$login->notify( 'userRegistered' );

的login.php

namespace Observer\Observable;

use Observer\Interfaces;

class Login implements Interfaces\Observable {

private $observers = array();

function attach( Interfaces\Observer $object ) {

$this->observers[] = $object;

}

function getObservers() {

return $this->observers;

}

function notify( $action, $data = null ) {

foreach( $this->observers as $observer ) :

if( method_exists( $observer, $action ) ) $observer->$action( $data );

endforeach;

}

}

Email.php

namespace Observer\Observer;

use Observer\Interfaces;

class Email implements Interfaces\Observer {

function userLoggedIn( $data = null ) {

echo "email user logged in";

}

function userLoggedOut( $data = null ) {

echo "email user logged out";

}

function userRegistered( $data = null ) {

echo "email user registered";

}

}

我的问题是在处理多个动作时是否有更好的方法来实现Observer模式.

最佳答案 我不认为你的实施是错误的,但它并不适合我.你的Observable必须知道事件处理函数并实现它们(没有某种接口以保证它们在那里.为了继续你的方式,我要确保任何附加到Login的东西应该实现一个接口,保证那些动作函数将在那里.从那里,Login不必学习任何关于观察者的东西,它只是调用函数.

我将采取的另一种方法是特定事件名称的处理程序,如下所示:

class Observable {

protected static $event_names = array();

protected $observers = array();

function __construct() {

foreach (static::$event_names as $event_name) {

$this->observers[$event_name] = array();

}

}

function register($event, $object, $handler) {

if (array_key_exists($event, $this->observers)) {

$this->observers[$event][] = array($object, $handler);

} else {

echo "Invalid event \"$event\"!";

}

}

function trigger($event, $data = null) {

foreach ($this->observers[$event] as $observer) {

$observer[0]->$observer[1]($data);

}

}

}

class Login extends Observable {

protected static $event_names = array("userLoggedIn", "userLoggedOut", "userRegistered");

}

然后你是观察员会注册这样的事件:

class SomeListener {

function __construct() {

$login_instance->register("userLoggedIn", $this, "myLoggedInHandler");

}

function myLoggedInHandler($data = null) {

echo "User Logged In.";

}

}

这只是一个意见,但它是一种不同的方法,但它只需要知道什么事件触发(你的方法可以被认为也可以做,但是Observable应该简单地只调用处理程序方法IMO).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统,可以是移动应用、网页服务或集成到智能农业设备。 7. **实时监测**:在实际应用,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值