什么都不说,先看代码:

interface userOperateImpl
{
public function operate($username);
} class userLoginLog implements userOperateImpl
{
public function operate($username)
{
echo '用户名为 ['.$username.'] 的用户登陆记录日志<br/>';
}
} class UserLoginPush implements userOperateImpl
{
public function operate($username)
{
echo '用户名为 ['.$username.'] 的用户登陆推送消息<br/>';
}
} class UserLogin
{
private $_obj = array();
public $username; public function __construct($username,$_objArr = array())
{
$this->username = $username;
$this->_obj = $_objArr;
} public function userLogin()
{
echo "用户名为 [".$this->username."] 的用户登陆!<br/>";
$this->trigger();
} private function trigger()
{
if(!empty($this->_obj)){
foreach($this->_obj as $obj){
/** @var userOperateImpl $obj */
$obj->operate($this->username);
}
}
}
} $user = new UserLogin('Mr Li', array(
new userLoginLog(),
new UserLoginPush()
)
);
$user->userLogin();

解释:

编写接口userOperateImpl表示用户操作,将登陆记录的日志,推送实现该接口,代表两个观察者.

编写主题类UserLogin,构造函数里出入用户名和观察者,在用户登陆方法中将消息传递给观察者!

注:

在观察者模式中,会改变的是主题的状态以及观察者的数目。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。——找出程序中会变化的方面,然后将其和固定不变的方面相分离!
 
 主题和观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的优点! ——针对接口编程,不针对实现编程!
 观察者模式利用“组合”将许多观察者组合进主题中。对象(观察者——主题)之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式产生的。 ——多用组合,少用继承!

最新文章

  1. 计算机中的大小端模式及C语言中如何鉴别他们
  2. 【hihocoder 1039 字符串消除】模拟
  3. IOS开发UI篇-NavigationController的基本使用
  4. C# - Byte类型与String类型互转
  5. 想入门webpack,这篇就够了
  6. perl-cgi基础
  7. VS2008 C++ 利用WinHttp API获取任意Http网址的源码
  8. leetcode算法:Reshape the Matrix
  9. mysql explain extra理解
  10. MR 实例
  11. Python学习--Python变量类型
  12. CISCO静态路由配置
  13. poj3889
  14. Java 中int、String的类型转换
  15. 735. Asteroid Collision彗星相撞后的消失数组
  16. nginx 启动 + uwsgi + django
  17. JS实现下拉单的二级联动
  18. 基于链路的OSPFMD5口令认证
  19. dockerfile创建php容器(安装memcached、redis、gd、xdebug扩展)
  20. java锁的简化

热门文章

  1. android的ArrayMap类
  2. Android画图Path的使用
  3. Python中获取字典中最值对应的键
  4. Spring MVC 4.2 增加 CORS 支持 Cross-Origin
  5. post 与 get 在转码的区别
  6. bzoj1837: [CROATIAN2009]cavli 凸包1
  7. C++中没有finally,那么应该在如何关闭资源
  8. 黄聪:PHP7.0中htmlspecialchars出错解决方案(wordpress)
  9. 动画_ _ Android应用开发之所有动画使用详解
  10. centos中rabbitmq的安装及php支持