观察者模式

1.用js实现观察者模式

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
	div{width: 100px;height: 100px;border: 1px #999 solid;margin-bottom: 5px;}
	</style>
</head>
<body>
<!-- 
我们让div对象观察select的变化,selecte变化就会通知这个2个对象,并引起这2个对象的变化,实现观察者模式。
 -->
 <h1>用观察者模式切换页面风格</h1>

 <select>
 	<option value="male">男式风格</option>
 	<option value="female">女士风格</option>
 </select>

 <button οnclick="t1()">观察学习区</button>
  <button οnclick="t2()">不观察学习区</button>


 <div id="content">我是内容</div>
 <div id="ad">我是广告</div>
 <div id="study">学习</div>
</body>
<script type="text/javascript">
	var sel = document.getElementsByTagName('select')[0];
	sel.observers = {};
	sel.attach = function(key,obj){
		this.observers[key] = obj;
	}
	sel.detach = function(key){
		delete this.observers[key];
	}

	sel.onchange = sel.notify = function(){
		for(var key in this.observers){
			this.observers[key].update(this);
		}
	} 

	//客户端
	var content = document.getElementById('content');
	var ad = document.getElementById('ad');
	content.update = function(ob){
		if (ob.value == 'male') {
			this.style.backgroundColor = 'gray';
		}else if(ob.value == 'female'){
			this.style.backgroundColor = 'pink';
		}
	}
	ad.update = function(ob){
		if (ob.value == 'male') {
			this.innerHTML = '汽车';
		}else if(ob.value == 'female'){
			this.innerHTML = '减肥';
		}
	}

	//让content观察select的变化
	sel.attach('content',content);
	sel.attach('ad',ad);

	//新增监听study区
	var study = document.getElementById('study');
	study.update = function(ob){
		if (ob.value == 'male') {
			this.innerHTML = '学习计算机';
		}else if(ob.value == 'female'){
			this.innerHTML = '学习美容';
		}
	}
	sel.attach('study',study);


	function t1(){
		sel.attach('study',study);
	}
	function t2(){
		sel.detach('study');
	}
</script>
</html>

2.用php实现观察模式

<?php
//php实现观察者

//php5中提供观察者observer和被观察者subject的接口

class User implements SplSubject
{
	public $lognum;
	public $hobby;

	protected $observers = null;

	public function __construct($hobby)
	{
		$this->lognum = rand(1,10);
		$this->hobby = $hobby;
		$this->observers = new SplObjectStorage();
	}

	public function login()
	{
		//操作session等
		$this->notify();
	}

	public function attach(SPLObserver $observer)
	{
		$this->observers->attach($observer);
	}
	public function detach(SPLObserver $observer)
	{
		$this->observers->detach($observer);
	}
	public function notify()
	{
		$this->observers->rewind();
		while ($this->observers->valid()) {
			$observer = $this->observers->current();
			$observer->update($this);
			$this->observers->next();
		}
	}
}

//用户安全登录模块
class Safe implements SPLObserver
{
	public function update(SplSubject $subject)
	{
		if ($subject->lognum < 3) {
			echo '这是第' . $subject->lognum . '次安全登录<br>';
		}else{
			echo '这是第' . $subject->lognum . '次登录,异常<br>';
		}
	}
}

//广告模块
class Ad implements SPLObserver
{
	public function update(SplSubject $subject)
	{
		if ($subject->hobby == 'sports') {
			echo '英超开始啦<br>';
		}else{
			echo '好好学习<br>';
		}
	}
}


//实施观察
// $user = new User('sports');
$user = new User('study');
$user->attach(new Safe());
$user->attach(new Ad());


$user->login();//登录


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值