设计模式之观察者模式

观察者模式需要观察者和被观察者对象。

被观察者要能添加观察对象,被观察者发生改变之后要能通知观察者做出相应的改变(也就是回调观察者对象的相关方法,同时将被观察者自己传递过去)。

观察者对象要有统一的回调方法,这样才能产生一系列可以由被观察者调用的观察者对象;另外观察者需要可以取消监听观察者对象的方法。(可以通过实现接口搞定)


代码示例如下:

观察者要实现的接口

package com.company.test;

//观察者应该实现的接口,里面包含观察对象的回调方法
public interface Observer {
	
	/**
	 * 被观察者发生改变之后通过该方法回调观察者做出对应改变
	 * @param observed 被观察者对象
	 */
	public void update(Observed observed);
	
	/**
	 * 注销被观察者里面注册的该对象
	 * @param observed  被观察者对象
	 */
	public void unReg(Observed observed);
}

观察者1

package com.company.test;

public class WebObserver implements Observer {

	@Override
	public void update(Observed observed) {
		// TODO Auto-generated method stub
		System.out.println("更新观察者名字为: " + observed.getName());
	}

	@Override
	public void unReg(Observed observed) {
		// TODO Auto-generated method stub
		observed.getObservers().remove(this);
		
	}

}

观察者2

package com.company.test;

public class MailObserver implements Observer {

	@Override
	public void unReg(Observed observed) {
		// TODO Auto-generated method stub
		//撤销注册
		observed.getObservers().remove(observed);
	}

	@Override
	public void update(Observed observed) {
		// TODO Auto-generated method stub
		//当被观察者name改变时,邮件通知相关人员
		System.out.println("通过邮件通知相关人员观察者名字改变为:" + observed.getName());

	}

}
被观察者
package com.company.test;

import java.util.HashSet;

public class Observed {
	private String name;
	private HashSet<Observer> observers;
	
	//构造方法
	public Observed(String name) {
		this.name = name;
		observers = new HashSet<Observer> ();
	}
	
	//添加观察者
	public void addObserver(Observer observer) {
		observers.add(observer);
	}
	
	//通知观察者执行update方法
	public  void notifyObserver() {
		for(Observer ob:observers) {
			ob.update(this);
		}
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
		//名字被改变的时候通知观察者
		this.notifyObserver();
	}

	public HashSet<Observer> getObservers() {
		return observers;
	}

	public void setObservers(HashSet<Observer> observers) {
		this.observers = observers;
	}
	
	
}

调用测试类

package com.company.test;

public class ObserverPattern {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Observed observed = new Observed("xiaoming");
		Observer ob1 = new WebObserver();
		Observer ob2 = new MailObserver();
		
		observed.addObserver(ob1);
		observed.addObserver(ob2);
		
		System.out.println("第一次改变被观察者名字");
		observed.setName("ligang");
		
		//观察者1取消观察
		ob1.unReg(observed);
		
		System.out.println("第二次改变被观察者名字");
		observed.setName("xiaoxiao");
		
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值