java 设计模式之观察者模式
观察者模式的定义:
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
结构图:
3、可以看到,该模式包含四个角色
- 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
- 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
- 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
4.Java代码演示
1.定义被观察者接口
package com.summer.observer;
/**
* @ClassName: Observable
* @Description:被观察者接口
* @author: summer
* @date: 2019年1月14日 下午5:20:54
*
*/
public interface Observable {
/**
* @Title: registObserver
* @Description: 添加观察者
* @param observer
* @return: void
* @throws
*/
public void registObserver(Observer observer);
/**
* @Title: removeObserver
* @Description: 删除观察者
* @param observer
* @return: void
* @throws
*/
public void removeObserver(Observer observer);
/**
* @Title: notify
* @Description: 通知所有观察者
* @param message
* @return: void
* @throws
*/
public void notify(String message);
}
2.定义观察者接口
package com.summer.observer;
/**
* @ClassName: Observer
* @Description:定义观察者接口
* @author: summer
* @date: 2019年1月14日 下午5:20:37
*
*/
public interface Observer {
public void dosomething(String message);
}
3.定义被观察者实现类,这里使用微信公众号的方式,公众号就是被观察者,普通微信用户就是观察者,只有关注了公众号才可以收到公众号的消息
package com.summer.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: WetChatServer
* @Description:被观察者,微信公众号
* @author: summer
* @date: 2019年1月15日 下午2:50:49
*
*/
public class WetChatServer implements Observable {
private List<Observer> observers = new ArrayList<>();
public List<Observer> getObservers() {
return observers;
}
public void setObservers(List<Observer> observers) {
this.observers = observers;
}
public WetChatServer(List<Observer> observers) {
super();
this.observers = observers;
}
@Override
public void registObserver(Observer observer) {
if(!observers.contains(observer)){
observers.add(observer);
}
}
@Override
public void removeObserver(Observer observer) {
if(observers.contains(observer)){
observers.remove(observer);
}
}
@Override
public void notify(String message) {
for (Observer observer : observers) {
observer.dosomething(message);
}
}
}
4.定义观察者,可以定义多个,实现Observer接口。这里省略
package com.summer.observer;
public class Client01 implements Observer {
@Override
public void dosomething(String message) {
System.out.println("Client01收到了消息:"+message);
}
}
5.编写测试类
package com.summer.observer;
import java.util.ArrayList;
import java.util.List;
public class TestObserver {
public static void main(String[] args) {
List<Observer> observers = new ArrayList<>();
WetChatServer wetChatServer = new WetChatServer(observers);
Client01 client01 = new Client01();
Client02 client02 = new Client02();
Client03 client03 = new Client03();
//订阅了公众号
wetChatServer.registObserver(client01);
wetChatServer.registObserver(client02);
wetChatServer.registObserver(client03);
String message = "微信公众号更新消息了:2019,你好";
System.out.println("服务器发布消息:"+message);
wetChatServer.notify(message);
//client03取消关注
System.out.println("##############################################");
wetChatServer.removeObserver(client03);
wetChatServer.notify(message);
}
}
运行结果:
服务器发布消息:微信公众号更新消息了:2019,你好
Client01收到了消息:微信公众号更新消息了:2019,你好
Client02收到了消息:微信公众号更新消息了:2019,你好
Client03收到了消息:微信公众号更新消息了:2019,你好
##############################################
Client01收到了消息:微信公众号更新消息了:2019,你好
Client02收到了消息:微信公众号更新消息了:2019,你好
还没有评论,来说两句吧...