博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——观察者模式
阅读量:7173 次
发布时间:2019-06-29

本文共 3581 字,大约阅读时间需要 11 分钟。

    HeadFirst中对观察者模式的定义:观察者模式定义了对象之间的一对多的依赖,这样一来,当一个状态发生变化时,它的所有依赖者都会收到通知并自动更新。

   松耦合:当两个对象时间松耦合,它们依然可以交互,但是不太清楚彼此的细节。

   观察者模式提供了一种对象设计,让主题和观察者之间的松耦合。

   有两种自动更细的方式,主题推送给每个观察者或者观察者从主题中拉取。

   Java中内置了观察者模式,可以很方便的写出代码。

   自己写了两个Demo,一个是自己实现,一个是借助Java中的实现。

  Demo1:

 

package com.wxisme.observer;import java.util.ArrayList;import java.util.List;/** * 主题接口 * @author wxisme  *  */public interface Subject {	List
observerList = new ArrayList<>(); void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObserver();}

 

 

package com.wxisme.observer;/** * 观察者接口 * @author wxisme */public interface Observer {	void update(Subject subject);}

 

package com.wxisme.observer;/** * 具体的主题对象,实现主题接口 * @author wxisme * */public class ConcreteSubject implements Subject {		private int state;    	@Override	public void registerObserver(Observer observer) {		ConcreteSubject.observerList.add(observer);	}		@Override	public void removeObserver(Observer observer) {		ConcreteSubject.observerList.remove(observer);	}	@Override	public void notifyObserver() {		for(int i=0; i

 

package com.wxisme.observer;/** * 具体的观察者,实现观察者接口。 * @author wxisme * */public class ConcreteObserver implements Observer {	private int myState;	@Override	public void update(Subject subject) {		setMyState(((ConcreteSubject)subject).getState());		System.out.println("myState changed:" + myState);	}		public int getMyState() {		return myState;	}	public void setMyState(int myState) {		this.myState = myState;	}}

 

package com.wxisme.observer;/** * 测试观察者模式 * @author wxisme */public class Demo {	public static void main(String[] args) {		//一个主题对应多个观察者		ConcreteSubject csbj = new ConcreteSubject();		ConcreteObserver cobs1 = new ConcreteObserver();		csbj.registerObserver(cobs1);		ConcreteObserver cobs2 = new ConcreteObserver();		csbj.registerObserver(cobs2);		ConcreteObserver cobs3 = new ConcreteObserver();		csbj.registerObserver(cobs3);		//当主题的状态改变时,会通知每个观察者,每个观察者会做出相应的状态改变。		csbj.setState(20);		System.out.println("------------------");		csbj.setState(400);			}}

 运行结果:

  myState changed:20

  myState changed:20
  myState changed:20
  ------------------
  myState changed:400
  myState changed:400
  myState changed:400

 

package com.wxisme.javaobserver;import java.util.Observable;public class ConcreteSubject extends Observable {	private int state;		public int getState() {		return state;	}	public void setState(int state) {		this.state = state;		setChanged();		notifyObservers(state);	}}

 

package com.wxisme.javaobserver;import java.util.Observable;import java.util.Observer;public class ConcreteObserver implements Observer {	private int myState;	@Override	public void update(Observable obs, Object obj) {		setMyState(((ConcreteSubject)obs).getState());		System.out.println("myState changed:" + myState);	}		public void setMyState(int myState) {		this.myState = myState;	}	public int getMyState() {		return myState;	}}

 

package com.wxisme.observer;/** * 测试观察者模式 * @author wxisme */public class Demo {	public static void main(String[] args) {		//一个主题对应多个观察者		ConcreteSubject csbj = new ConcreteSubject();		ConcreteObserver cobs1 = new ConcreteObserver();		csbj.registerObserver(cobs1);		ConcreteObserver cobs2 = new ConcreteObserver();		csbj.registerObserver(cobs2);		ConcreteObserver cobs3 = new ConcreteObserver();		csbj.registerObserver(cobs3);		//当主题的状态改变时,会通知每个观察者,每个观察者会做出相应的状态改变。		csbj.setState(20);		System.out.println("------------------");		csbj.setState(400);			}}

 运行结果:

myState changed:20

myState changed:20
myState changed:20
------------------
myState changed:400
myState changed:400
myState changed:400

 

转载地址:http://azbzm.baihongyu.com/

你可能感兴趣的文章
Struts2整合Hibernate3实现用户登录功能
查看>>
10.21html 标签
查看>>
silverlight 乐动魔方 实战十 .
查看>>
简单的算术题。
查看>>
黎活明8天快速掌握android视频教程--18_在SQLite中使用事务
查看>>
jdbc
查看>>
心理学效应:阿基米德与酝酿效应
查看>>
Linux之/etc/inittab文件
查看>>
Angular JS 作用域和数据绑定
查看>>
jquery学习记录四(操作DOM元素)
查看>>
js实现图片下载
查看>>
apktool.bat
查看>>
[转] CMake
查看>>
HDU 2159 FATE
查看>>
Cview的派生类
查看>>
Android activity的生命周期
查看>>
HTML5+Css3-webkit-filter
查看>>
css border-bottom(指定下边线的样式、宽度及颜色)
查看>>
P1352 没有上司的舞会
查看>>
Bzoj 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐 深搜,bitset
查看>>