设为首页 加入收藏

TOP

设计模式之-观察者模式
2019-05-14 13:44:13 】 浏览:55
Tags:设计模式 观察者 模式
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/charry_a/article/details/79389733

一、观察者模式

JAVA设计模式有23种,平时工作中也使用了一些,比如单例,模板,策略,建造者等,但最近在学习zk过程中,发现zk提供的发布订阅功能和设计模式里面的观察者模式原理差不多,故顺便了解观察者模式是如何实现的,整体来说比较简单,一个被观察者,N个观察者,当被观察者的行为发生改变的时候,观察者能够监听到这个变化,从而做出相应的行为处理。


二、代码实现

这里我们模拟实现一个这样的场景,上级公司领导来视察,分子公司要通知各个部门做好相关的接待工作,比如领导来了后,保安室做好安保工作,前台做好接待工作,业务部门做好业务交流工作等。

被观察者抽象类


import java.util.ArrayList;
import java.util.List;

public abstract class Subject被观察者 {
	
	public List<Observer> list = new ArrayList<Observer>();

/**添加观察者 */
	public void addObserver(Observer observer) {
		this.list.add(observer);
	}
	
/** 删除观察者*/
	public void deleteObserver(Observer observer) {
		this.list.remove(observer);
	}
/** 通知观察者 */
       public void notifyAllObserver() {
		for(final Observer obs : list) {
			obs.doSomething();
		}
	}
	
	public abstract
		    

void doSomething(); }

观察者接口


public interface Observer {

	void doSomething();
}

被观察者实现类


public class Leader extends Subject被观察者 {

	@Override
	public void doSomething() {
		System.out.println("领导已经到达公司门口,请各部门做好相关准备!");
		this.notifyAllObserver();
	}

}

当被观察者发生行为变化的时候,就要通知各个观察者

第一个观察者:保安室观察者

public class 保安室观察者  implements Observer{

	@Override
	public void doSomething() {
		System.out.println("我们是保安室,刚收的通知说领导已经到了,请把车库车位挪一下");
	}

}

第二个观察者:部门观察者

public class 部门观察者  implements Observer{

	@Override
	public void doSomething() {
		System.out.println("我们是部门观察者,刚收的通知说领导已经到了,请各位做好相关任务工作");
	}

}

运行如下代码


       public static void main(String[] args) {
		Subject被观察者 subject被观察者 = new Leader();
		subject被观察者.addObserver(new 保安室观察者());
		subject被观察者.addObserver(new 部门观察者());
		subject被观察者.doSomething();
	}

运行后效果如下


领导已经到达公司门口,请各部门做好相关准备!
我们是保安室,刚收的通知说领导已经到了,请把车库车位挪一下
我们是部门观察者,刚收的通知说领导已经到了,请各位做好相关任务工作



编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇hadoop配置项的调优 下一篇[前端基础]-- HTML&CSS

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }