观察者模式

《Head First Design Patterns》观察者模式学习练习:

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,他的所有观察者都会收到通知并自动更新。

  首先,定义观察者模式:主题+观察者 = 观察者模式 

以客户和客服人员为例,当有客户咨询时,需要通知每个客服人员。

其中,Subject为主题接口,Customer为顾客信息,CustomData为主题接口实现类

Observer为观察者接口,ServiceAgent为观察者接口实现类。

TestObserver为测试类。

主题:

/*
 * 主题
 */
public interface Subject {
	public void registerObserver(Observer ob);
	public void removeObserver(Observer ob);
	public void notifyObservers();
}
/*
 * 顾客信息
 */
public class Customer {
	//姓名
	private String name;
	//年龄
	private String age;
	//性别
	private String gender;
	
	public Customer(String name, String age, String gender) {
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
}
public class CustomData implements Subject{
	private ArrayList<Observer> observers;
	private Customer customer;
	
	public CustomData() {
		observers = new ArrayList<Observer>();
	}

	@Override
	public void registerObserver(Observer ob) {
		// TODO Auto-generated method stub
		observers.add(ob);
	}

	@Override
	public void removeObserver(Observer ob) {
		// TODO Auto-generated method stub
		int i = observers.indexOf(ob);
		if(i>=0){
			observers.remove(i);
		}
	}

	@Override
	public void notifyObservers() {
		// TODO Auto-generated method stub
		for(int i=0; i<observers.size();i++){
			Observer ob = observers.get(i);
			ob.update(customer);
		}
	}
	public void setCustomer(Customer customer){
		this.customer = customer;
		notifyObservers();
	}
}
观察者

/*
 * 观察者
 */
public interface Observer {
	public void update(Customer customer);
}
public class ServiceAgent implements Observer{
	/*
	 * 客服名称
	 */
	private String name;
	
	public ServiceAgent(CustomData cData) {
		cData.registerObserver(this);
	}
	@Override
	public void update(Customer customer) {
		// TODO Auto-generated method stub
		System.out.println("" + name + "已经接收到客户" + customer.getName() +"的信息");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
测试类:

public class TestObserver {
	public static void main(String[] args){
		CustomData customData = new CustomData();
		ServiceAgent agent1 = new ServiceAgent(customData);
		agent1.setName("agent1");
		ServiceAgent agent2 = new ServiceAgent(customData);
		agent2.setName("agent2");
		ServiceAgent agent3 = new ServiceAgent(customData);
		agent3.setName("agent3");
		ServiceAgent agent4 = new ServiceAgent(customData);
		agent4.setName("agent4");
		customData.setCustomer(new Customer("哈利波特", "22", "男"));
		customData.setCustomer(new Customer("赫敏", "22", "女"));
	}
}



测试结果如下:



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值