简单理解设计模式之观察者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YQYnsmile/article/details/78401349

  设计模式其实没有我们想的那么难!我们认真的理解好设计模式的概念,知道它到底是解决什么问题的这才能更好的掌握。下面我们来探讨下设计模式里面的观察者模式。

 (1)观察者模式的概念

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

(2)理解好观察者模式的概念
我们来分解的消化这句话,首先定义对象的一对多关系,在编程开发的过程中,我们一般怎么表示一对多,是不是通过集合类来实现的呢?然后是当一个对象的状态发生改变的时候,所有依赖他的对象要得到通知和自动更新。这里有两个因素,第一是对象的状态发生了改变,即是对象的属性发生了改变,第二是当改变的时候通知依赖他的对象。
(3)通过代码来详细的实现我们的理解过程
step 1 : 创建我们的主题对象,我比较喜欢称它为老大对象。
/**
 * 老大对象(主题对象)
 * */
public class Subject {
	
	//既然是老大,那就必须要有小弟
	private List<Observer> observer = new ArrayList<Observer>();
	//老大的状态
	private int state;
	
	public int getState(){
		return state;
	}
	//当老大的状态发生改变的时候,得通知小弟去搞事情吧
	public void setState(int state){
		this.state = state;
		notifyAllObserver();
	}
	//每一天都有要新加入的小弟
	public void attach(Observer observer){
		this.observer.add(observer);
		
	}
	//有公告要通知每个小弟
	public void notifyAllObserver(){
		for(Observer observer : this.observer){
			observer.update();
		}
	}
}
step 2:观察者(Object),我一般喜欢称呼他为小弟模板(要加入我们必须要守规矩)
public abstract class Observer {
	 //心中要有老大
	 protected Subject subject;
	 //接受老大的提示,执行行动
	 abstract void update();
}
step 3 :下面就是各种小弟啦,哈哈
public class FirstObserver extends Observer{
	
	public FirstObserver(Subject subject){
		this.subject = subject;
		this.subject.attach(this);
	}
	@Override
	void update() {
		System.out.println("current state is"+this.subject.getState()+19);
		
	}

}
public class SecondObserver extends Observer{
	
	public SecondObserver(Subject subject){
		this.subject = subject;
		this.subject.attach(this);
	}

	@Override
	void update() {
		System.out.println("current state is"+this.subject.getState()+19);
		
	}
	

}
step 4:大哥说要干活了
public class testObserver {
	
	public static void main(String[] args) {
		Subject subject = new Subject();
		FirstObserver f = new FirstObserver(subject);
		SecondObserver s =new SecondObserver(subject);
		f.update();
		s.update();
		subject.setState(39);
		
	}

}
结果:
current state is3919
current state is3919
current state is88919
current state is88919

好了,其实就是这样,具体的理解一定要结合开发的经验。
有不对地方的欢迎指教交流。









  

猜你喜欢

转载自blog.csdn.net/YQYnsmile/article/details/78401349