设计模式之观察者模式

观察者模式是对象的行为模式,顾名思义,即存在观察者和被观察者。 观察者模式可以让多个观察者同时监听同一个被观察对象,当被观察对象发生变化时,并通知所有观察者,使各个观察者能作出相应的响应。适当地运用观察者模式,能提高自身代码的设计水平。

  观察者模式理解和编码都比较简单,通常包括以下步骤:

  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  可以看看

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值