自己实现观察者模式

观察者模式涉及角色:

 

1)  抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。
2)  抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现。
3)   具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer对象。当它的状态发生改变时, 向它的各个观察者发出通知。
4)  具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject对象的引用。

 

 

/**
 * 
 */
package com.gd.util;

import java.util.Vector;

/**
 * @author Sandy
 * 抽象主题角色
 */
public abstract class Subject {
	private Vector<Observer> observerVector=new Vector<Observer>();
	public void addObserver(Observer observer){
		this.observerVector.add(observer);
	}
	public void deleteObserver(Observer observer){
		this.observerVector.removeElement(observer);
	}
	public void notifyObservers(Object arg){
		Object[] obj=this.observerVector.toArray();
		for (int i=0; i<obj.length;i++) {
			((Observer)obj[i]).update(this,arg);
		}
	}
}

 

 

package com.gd.util;


/**
 * 
 * @author sandy
 * 具体主题角色
 */
public class ConcreteSubject extends Subject {
	public void change(Object object){
			this.notifyObservers(object);
	}
}

 

/**
 * 
 */
package com.gd.util;

/**
 * @author Sandy 抽象观察者角色
 */
public interface Observer {
	void update(Subject subject, Object object);
}

 

/**
 * 
 */
package com.gd.util;

import com.gd.model.News;

/**
 * @author sandy
 * 1号具体观察者角色
 */
public class ConcreteObserver1 implements Observer {

	/* (非 Javadoc)
	 * @see com.gd.uti.Observer#update(com.gd.uti.Subject, java.lang.Object)
	 */
	public void update(Subject subject, Object object) {
		if(object instanceof News){
			News news=(News)object;
			System.out.println("1号订阅者获得的新闻主题为:"+news.getNewsTitle());
		}

	}

}

 

/**
 * 
 */
package com.gd.util;

import com.gd.model.News;

/**
 * @author Sandy
 * 2号具体观察者角色
 */
public class ConcreteObserver2 implements Observer {

	/* (非 Javadoc)
	 * @see com.gd.uti.Observer#update(com.gd.uti.Subject, java.lang.Object)
	 */
	public void update(Subject subject, Object object) {
		if(object instanceof News){
			News news=(News)object;
			System.out.println("2号订阅者获得的新闻主题为:"+news.getNewsTitle());
		}
	}
}

 

实体类:

package com.gd.model;
/**
 * 
 * @author sandy
 *
 */
public class News {
	private String newsTitle;
	private String newsBody;
	
	public News(String newsTitle, String newsBody) {
		super();
		this.newsTitle = newsTitle;
		this.newsBody = newsBody;
	}
	public String getNewsBody() {
		return newsBody;
	}
	public String getNewsTitle() {
		return newsTitle;
	}
	

}

 

客户端测试程序:

package com.gd.uti.test;

import org.junit.Test;

import com.gd.model.News;
import com.gd.util.ConcreteObserver1;
import com.gd.util.ConcreteObserver2;
import com.gd.util.ConcreteSubject;

/**
 * 
 * @author sandy
 * 观察者客户端测试程序
 */
public class Client {
	
	@Test
	public void test(){
		News news=new News("国际新闻..","关于日本扣留中国船长...........");
		ConcreteSubject subject=new ConcreteSubject();
		ConcreteObserver1 observer1=new ConcreteObserver1();
		ConcreteObserver2 observer2=new ConcreteObserver2();
		subject.addObserver(observer1);
		subject.addObserver(observer2);
		subject.change(news);
	}
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值