设计模式之观察者模式

来源:互联网 发布:企业域名保护 编辑:程序博客网 时间: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  可以看看

原创粉丝点击