观察者模式

目录

一、观察者模式的定义

二、类图

三、例子


一、观察者模式的定义

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

二、类图

三、例子

场景:你开通了一个天气预报频道(主题),最近涨了两个粉丝(观察者),你发布了最近的天气信息,他们就能看到发布的消息,如果取消关注,就看不到了,看看怎么实现

1、主题角色

/**
 * 主题接口
 */

public interface Subject {
	// 注册观察者
	public void registerObserver(Observer o);
	// 移除观察者
	public void removeObserver(Observer o);
	// 发布消息,通知观察者
	public void notifyObservers(String msg);

}

2、观察者角色

/**
 *  观察者接口 
 */

public interface Observer {

	public void update(String msg);
	
}

3、主题实现类

/**
 * 主题实现类
 */

public class WeatherChannel implements Subject {

	private String name;

	private ArrayList<Observer> observers;

	public WeatherChannel(String name) {
		this.name = name;
		observers = new ArrayList<Observer>();
	}

	@Override
	public void registerObserver(Observer o) {
		observers.add(o);
		System.out.println(o.toString() + " 关注了" + name);
	}

	@Override
	public void removeObserver(Observer o) {
		int i = observers.indexOf(o);
		if (i >= 0) {
			observers.remove(o);
		}
		System.out.println(o.toString() + " 取消关注" + name);
	}

	@Override
	public void notifyObservers(String msg) {
		System.out.println("发布消息:" + msg);
		for (Observer o : observers) {
			o.update(msg);
		}
	}

}

4、观察者实现类

/**
 *  观察者实现类
 *
 */

public class WeatherFans implements Observer {

	private String name;

	public WeatherFans(String name) {
		this.name = name;
	}

	@Override
	public void update(String msg) {
		System.out.println(this.name + " 收到消息:" + msg);
	}

	@Override
	public String toString() {
		return this.name;
	}
}

5、测试

public class ObserverTest {

	public static void main(String[] args) {
		//创建'天气预报频道'主题实例
		Subject subject = new WeatherChannel("[天气预报频道]");
		//创建两个粉丝
		Observer observer1 = new WeatherFans("粉丝1号");
		Observer observer2 = new WeatherFans("粉丝2号");
		//粉丝关注主题
		subject.registerObserver(observer1);
		subject.registerObserver(observer2);
		//主题发布消息
		subject.notifyObservers("2018-12-03天气降温,注意保暖哦!");
		//移除粉丝1号
		subject.removeObserver(observer1);
		//主题再次发布消息
		subject.notifyObservers("明天天气将持续低温,注意别感冒哦!");

	}
}

结果:

粉丝1号 关注了[天气预报频道]
粉丝2号 关注了[天气预报频道]
发布消息:2018-12-03天气降温,注意保暖哦!
粉丝1号 收到消息:2018-12-03天气降温,注意保暖哦!
粉丝2号 收到消息:2018-12-03天气降温,注意保暖哦!
粉丝1号 取消关注[天气预报频道]
发布消息:明天天气将持续低温,注意别感冒哦!
粉丝2号 收到消息:明天天气将持续低温,注意别感冒哦!

文章内容参考:Head First设计模式 第2章 观察者模式,上面的例子做了简单的修改,大家如有不同的想法,可以讨论讨论,共同进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值