观察者模式

Observer Pattern

  1. 定义观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
  2. 场景发布者发布消息,订阅者接受消息
  3. OO原则
    • 为交互对象之间的松耦合设计而努力,松耦合设计更有弹性,更能应对变化。

示例场景

关注了某公众号的用户可以收到推文,未关注的收不到推文,取消关注后也不能收到推文。

类图

示例代码

观察者接口

public interface Observer {
	public void update(String message);
}

可观察者接口

public interface Observerable {
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObsercers();
}

定义观察者

public class User implements Observer {

	private String username;
	private String message;
	
	public User(String username) {
		this.username = username;
	}
	
	@Override
	public void update(String message) {
		this.message = message;
		display();
	}
	
	public void display() {
		System.out.println(username + "收到推文:" + message);
	}
}

定义公众号

import java.util.List;
import java.util.ArrayList;

public class OfficialAccount implements Observerable {

	private List<Observer> list;
	private String message;
	
	public OfficialAccount() {
		list = new ArrayList<Observer>();
	}
	
	@Override
	public void registerObserver(Observer o) {
		list.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		if(!list.isEmpty())
			list.remove(o);
	}

	@Override
	public void notifyObsercers() {
		for (Observer observer : list) {
			observer.update(message);
		}
	}
	
	public void setInfo(String message) {
		this.message = message;
		System.out.println("公众号推文:" + message);
		
		//通知观察者
		notifyObsercers();
	}

}

创建测试类

public class Test {

	public static void main(String[] args) {
		OfficialAccount officialAccount = new OfficialAccount();
		
		//创建观察者
		Observer py = new User("py");
		Observer qpf = new User("qpf");
		
		//注册观察者
		officialAccount.registerObserver(py);
		officialAccount.registerObserver(qpf);
		
		//公众号编写推文
		officialAccount.setInfo("第一篇推文");
		
		//删除qpf后推文
		officialAccount.removeObserver(qpf);
		officialAccount.setInfo("第二篇推文");
	}

}

运行结果如下:

posted @ 2018-04-22 23:16  bkycrab  阅读(340)  评论(0编辑  收藏  举报