我是设计模式的新手。我有一个登录系统,其中包含用于连接到我的数据库之类的类。
但现在我想在我的 PHP 代码中包含观察者模式。但我不知道该怎么做。例如,每当有新用户时我都会通知用户。我知道观察者模式是如何工作的,例如它的作用。但我不知道如何将它包含到 PHP 代码中。那么如何制作一个包含观察者模式的登录系统呢?
例如,这是我到数据库的连接类:
private $pdo;
function __construct() {
$this->pdo = new PDO('mysql:host=localhost;dbname=users', '', '');
}
Run Code Online (Sandbox Code Playgroud)
这是我在登录文件中使用的代码:
if(isset($_POST['username']) && isset($_POST['password'])) {
include_once("classes/database.php");
$db = new DB();
$result = $db->query("SELECT username, pass FROM users WHERE username='".$_POST['username']."' AND pass='".$_POST['password']."'");
if(isset($result[0]['username']) && isset($result[0]['password'])) {
$_SESSION['username'] = $_POST['username'];
header("Location: start.php?username=".$_SESSION['username']);
}
Run Code Online (Sandbox Code Playgroud) 我理解观察者模式的工作原理,但为什么观察者模式减少了软件设计中 UI 和业务逻辑组件之间的耦合?
我正在研究 Observables 及其与 EventEmitter 的差异,然后偶然发现了 Subjects (我可以看到 Angulars EventEmitter 基于关闭)。
似乎 Observable 是单播 vs 多播的主题(然后 EE 只是一个主题,它将 .next 包装在发射中以提供正确的接口)。
Observables 似乎很容易实现
class Observable {
constructor(subscribe) {
this._subscribe = subscribe;
}
subscribe(next, complete, error) {
const observer = new Observer(next, complete, error);
// return way to unsubscribe
return this._subscribe(observer);
}
}
Run Code Online (Sandbox Code Playgroud)
哪里Observer只是一个添加一些尝试捕获和监控的包装器 isComplete 以便它可以清理并停止观察。
对于我想出的一个主题:
class Subject {
subscribers = new Set();
constructor() {
this.observable = new Observable(observer => {
this.observer = observer;
});
this.observable.subscribe((...args) => {
this.subscribers.forEach(sub => …Run Code Online (Sandbox Code Playgroud) 我想知道为什么.NET框架没有类似于Java功能的对(Observer/Observable)接口?
编辑: 是的我知道事件和代表,但使用这些接口是一个简单的书本方法这个DP不是吗?
试图找到一个例子,可能是我没有正确地解决它,或者我的想法过度简化了观察者模式的概念。
我想创建一个控制来自Web服务的消息的类,并且我希望该类监视许多其他操作的更改。
我所看到的观察者模式示例演示了许多观察者正在观察一个可观察对象,我是否(或者我应该)以相反的方式这样做?我还应该做什么?
好的,今天我遇到了这个问题,那时TI TMS470 C++编译器拒绝接受它.
这来自"Head First Design Patterns"示例代码的C++版本的Silver版本.
class foo {
...
protected:
virtual ~foo() = 0 {}; // compiler barfs on this line
};
Run Code Online (Sandbox Code Playgroud)
编译器拒绝接受"= 0"(纯虚拟)和"{}"的组合(我猜这是为了让派生类无论如何都要抛出析构函数.
究竟他们试图用这条线做什么,它真的是合法的C++,它有多重要?
使用NSNotificationCenter的正确方法是什么?
我想知道是否有一种指导方针来注册和删除特定类中的观察者.
NSNotificationCenter.DefaultCenter.AddObserver("NSString", Action)
Run Code Online (Sandbox Code Playgroud)
用于将对象注册为观察者.我怎样才能取消注册观察者?我是否必须保存数组中特定类的所有观察者?
先感谢您.问候.
design-patterns xamarin.ios nsnotificationcenter observer-pattern
使用观察者模式。我有一个类,例如Monitor,它监视对象的集合。该类是一个Observer,其集合中的每个对象都是Subject。当前,该集合被实现为shared_ptr的std :: list。在Monitor类的Update方法中,我要检查更新是否来自其集合中的对象之一。
std::list<SomeSharedPointer> items_;
...
void Monitor::Update(Subject *subject)
{
if(subject == something_)
{
DoSomething();
}
else if
??
// if subject is one of the objects in our collection then do something..
}
Run Code Online (Sandbox Code Playgroud)
这里的主题是原始指针,我的集合是shared_ptr的列表。如何有效检查进入的主题是否是集合中的任何对象?
(请注意,如果有算法解决方案需要一个,则我的编译器msvc将支持lambda)
更新
我应该补充一点,我意识到我可以在容器上使用for循环,但是我想知道是否有一种时髦的方法。
更新2
SomeSharedPointer为一个typedef std::shared_ptr<SomeType>其中SomeType从抽象类派生Subject(标准观察者模式实现)。SomeType将在某个时候调用Notify(),这将为Update()每个观察者调用该方法。
我想创建一个删除产品的观察者.表示管理员删除产品时,在删除过程中我想在此过程中添加一些自定义功能.目前我正在使用
catalog_controller_product_delete
Run Code Online (Sandbox Code Playgroud)
以此目的.但它对我没有任何作用.请帮我.如何在产品删除期间做些额外的事情?
我想将已删除的产品ID发送到我的API,我有这个产品的副本,这样我也可以从那里删除它,但它不会触发事件.我知道这是因为我正在触发sendProductDelReq()方法<method>sendProductDelReq</method>并且为了验证我在这个方法中放了一个骰子.
我已经设置了一个观察者,catalog_product_collection_load_after并调用以下代码:
<?php
class Drench_Admindetails_Model_Observer {
public function loadAfter($observer){
$collection = $observer->getEvent()->getCollection();
$collection->addAttributeToFilter('admin_id', Mage::getSingleton('admin/session')->getUser()->getUserId());
foreach($collection as $item) {
fb($item->getAdminId()); //fb() is a firebug call
}
return $this;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在过滤集合admin_id,我通过以下安装脚本(namespace/module/Resource/Eav/Mysql4/Setup.php)创建了集合.
<?php
class Drench_Admindetails_Resource_Eav_Mysql4_Setup extends Mage_Eav_Model_Entity_Setup
{
public function getDefaultEntities()
{
return array(
'catalog_product' => array (
'entity_model' => 'catalog/product',
'attribute_model' => 'catalog/resource_eav_attribute',
'table' => 'catalog/product',
'additional_attribute_table' => 'catalog/eav_attribute',
'entity_attribute_collection' => 'catalog/product_attribute_collection',
'attributes' => array (
'admin_id' => array (
'group' => '',
'label' => '',
'type' => …Run Code Online (Sandbox Code Playgroud) observer-pattern ×10
c++ ×2
magento ×2
php ×2
.net-2.0 ×1
abstract ×1
angular ×1
c# ×1
class ×1
javascript ×1
magento-1.5 ×1
observable ×1
oop ×1
rxjs ×1
shared-ptr ×1
xamarin.ios ×1