设计模式之观察者模式
来源:互联网 发布:企业域名保护 编辑:程序博客网 时间:2024/04/28 18:06
观察者模式是对象的行为模式,顾名思义,即存在观察者和被观察者。 观察者模式可以让多个观察者同时监听同一个被观察对象,当被观察对象发生变化时,并通知所有观察者,使各个观察者能作出相应的响应。适当地运用观察者模式,能提高自身代码的设计水平。
观察者模式理解和编码都比较简单,通常包括以下步骤:
1. 设计观察者接口类;
2. 观察者类实现该接口;
3. 设计被观察者抽象类,该类中提供一些方法,如:添加观察者对象,删除观察者对象,把事件通知给各个观察者对象;
4. 设计被观察者类,继承被观察者抽象类,在该类中,可以根据需要在该类中,可以定义方法:被观察者是否发生变化
以上四步,即完成了观察者模式的设计。下面代码分类进行描述以上步骤:
观察者接口类:
public interface Observer{
void doSomethings();
}
观察者实现类:
public class DetailObserver implements Observer
{
public void doSomethings()
{
System.out.println("do somethings");
}
}
被观察者抽象类
abstract public class AbstractMainSubject
{
/**
* 保存所有观察者对象
* */
private Vector observerList = new Vector();
public void addObserver(Observer observer)
{
observerList.addElement(observer);
}
/**
* 删除一个观察者对象
* */
public void delObserver(Observer observer)
{
observerList.removeElement(observer);
}
/**
* 通知所有登记过的观察者对象
* */
public void notifyObserver()
{
Enumeration enumeration = observers();
while(enumeration.hasMoreElements())
{
((Observer)enumeration.nextElement()).doSomethings();
}
}
/**
* 列出被观察对象的所有观察者对象
* */
public Enumeration observers()
{
return ((Vector)observerList.clone()).elements();
}
}
被观察者实现类
public class MainSubject extends AbstractMainSubject
{
private String state;
public void doSomethigs(String newState)
{
state = newState;
this.notifyObserver();
}
}
测试方法
public class MainTest
{
public static MainSubject mainSubject;
public static Observer observer;
public static void main(String[] args)
{
mainSubject = new MainSubject();
observer = new DetailObserver();
mainSubject.addObserver(observer);
mainSubject.doSomethigs("hello");
Observer newobserver = new DetailObserver();
}
}
------------------------------------------------------------------------------------------------------------------
//观察者设计模式(observer设计模式)class Person{private PersonListener listener;public void registerListener(PersonListener listener){this.listener = listener;}public void run(){if(listener!=null){Even even = new Even(this);this.listener.dorun(even);}System.out.println("runn!!");}public void eat(){if(listener!=null){Even e = new Even(this);this.listener.doeat(e);}System.out.println("eat!!");}}interface PersonListener{public void dorun(Even even);public void doeat(Even even);}class Even{private Person person;public Even() {super();// TODO Auto-generated constructor stub}public Even(Person person) {super();this.person = person;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;}}测试类
package cn.itcast.demo;
public class Demo3 {
/**
* @param args
*/
public static void main(String[] args) {
Person p = new Person();
p.registerListener(new MyListener1());
p.eat();
p.run();
}
}
class MyListener1 implements PersonListener{
public void doeat(Even even) {
System.out.println(even.getPerson()+"你天天吃,你就知道吃,你猪啊!!");
}
public void dorun(Even even) {
System.out.println(even.getPerson()+"你吃完就跑,有病!!");
}
}
http://www.blogjava.net/supercrsky/articles/202544.html 可以看看
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 黑马程序员 java网络编程
- Win32汇编语言学习笔记>>第二课:编写第一个Win32汇编程序
- ubuntu下安装JDK
- 基数估计的一些笔记
- css float(脱离正常流:向左/右浮动直到父元素/另一float, 不占空间)
- 设计模式之观察者模式
- NSUserDefaults读取和写入自定义对象
- 黑马程序员 java中的API总结
- JS之prototype基础篇
- 辞旧迎新,大展宏图!!!
- 调用匿名函数
- 2013终于来的.不容易啊。世界末日过去了,我们还活着。
- freeswitch 连接外部 SIP Provider
- 概率论与数理统计学习笔记一:事件的概率