观察者模式是对象的行为模式,顾名思义,即存在观察者和被观察者。 观察者模式可以让多个观察者同时监听同一个被观察对象,当被观察对象发生变化时,并通知所有观察者,使各个观察者能作出相应的响应。适当地运用观察者模式,能提高自身代码的设计水平。
观察者模式理解和编码都比较简单,通常包括以下步骤:
1. 设计观察者接口类;
2. 观察者类实现该接口;
3. 设计被观察者抽象类,该类中提供一些方法,如:添加观察者对象,删除观察者对象,把事件通知给各个观察者对象;
4. 设计被观察者类,继承被观察者抽象类,在该类中,可以根据需要在该类中,可以定义方法:被观察者是否发生变化
以上四步,即完成了观察者模式的设计。下面代码分类进行描述以上步骤:
观察者接口类:
public interface Observer { void doSomethings(); } |
观察者实现类:
public class DetailObserver implements Observer |
被观察者抽象类
abstract public class AbstractMainSubject |
被观察者实现类
public class MainSubject extends AbstractMainSubject |
测试方法
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 可以看看