观察者模式——设计模式篇

一、概念

1.引入

当我们初学代码的时候,不会太过在意类与类之间的一些联系,但是当我们做到聊天室的时候,我们就会发现这样的一个问题,很明显的就是,可能你的主类就会与其他类回环引用,就是绝对的高耦合,这样造成直接的后果就是,修改其中的一个类时,就要修改其它类中的代码,所谓牵一发而动全局,极端的情况,则是如下图:
观察者模式——设计模式篇
这个显然不适合企业维护自己的产品,改动一点啥都会改动全部,一个不小心,全部崩了,那就是一场灾难。

而在我们的设计者模式里定义了一种观察者模式,它定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

2.图解

观察者模式——设计模式篇
我们应该都有订阅过微信公众号,我们可以这样去理解,不同的公众号会发布不同的文章到关注他的用户的账号下。那么公众号与用户都是分开的。

二、两个名词

1.观察者

(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器里。(那么人就是观察者。)

2.被观察者

被观察对象发生了某种变化(公众号发布新的文章了),就从容器中得到所有注册过的观察者,将变化通知观察者。(找到所以关注自己的用户,并发送文章。)

三、事件驱动模型理解

观察者模式的另一种形态,观察者相当于监听器,被观察者相当于事件源;
事件源产生事件,监听器监听事件
我们之前都用过监听器,其实监听器的底层是存在一个list里面,所以顶层源码的设计就应该是使用了观察者模式;不同的事件源被监听,可能监听之后,不同的监听器作出不同的反应。

四、公众号demo

1.接口

/**
 * 抽象观察者
 * 定义更新方法,当被观察者使用通知方法的时候,观察者就刷新
 * @author chan
 */
public interface Observer {
	public void update(String message);
}

/**
 * 抽象被观察者接口
 * 声明添加删除通知方法
 */
public interface Observerable {
	public void addObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObserver();
}

2.实现

/**
 * 被观察者,微信公众号服务
 */
public class WeChatServer implements Observerable{

	private List<Observer> list;
	private String message;
	public void addObserver(Observer o) {
		list.add(o);
	}
	public WeChatServer() {
	        list = new ArrayList<Observer>();
	 }
	public void removeObserver(Observer o) {
		if(!list.isEmpty())
		list.remove(o);
	}

	@Override
	public void notifyObserver() {
		for(int i=0;i<list.size();i++)
		{
			Observer o=list.get(i);
			o.update(message);
		}
	}
	public void setInfomation(String s) {
		this.message=s;
		System.out.println("公众号发布消息:"+s);
		notifyObserver();
	}
}



public class User implements Observer {

	private String name;
	private String message;
	public User(String name){
		this.name=name;
		
	}
	public void update(String message) {
		this.message=message;
		read();
	}
	private void read() {
		System.out.println(name+" 收到公众号消息:"+message);
	}

}

3.测试

公众号发布消息:hello!miss you!
麻麻 收到公众号消息:hello!miss you!
霸霸 收到公众号消息:hello!miss you!
嘀嘀 收到公众号消息:hello!miss you!
美美 收到公众号消息:hello!miss you!
公众号发布消息:今天少了一个粉丝哟!
麻麻 收到公众号消息:今天少了一个粉丝哟!
霸霸 收到公众号消息:今天少了一个粉丝哟!
嘀嘀 收到公众号消息:今天少了一个粉丝哟!