今天给大家带来一个同样比较简单的设计模式,观察者模式,首先我们来看一下定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
根据这个定义,我们可以看出,主要分为两个部分,第一个是观察者,第二个是被观察者。为一对多的关系,当被观察者做出改变的时候,观察者们可以观察到这个变化。比较容易理解的例子就是我们的公众号,公众号就是被观察者,用户就是观察者,当公众号发表文章的时候,我们每个关注了的用户都能立即收到。我们进行分析,公众号主要有三个功能,分别为,关注、取消关注、推送消息。用户只有在关注了之后,才能在公众号做消息推送的时候进行接收。我们来书写一下这个被观察者的超类。
//被观察者
public interface Observerable<T>{
//订阅
public void subscribe(Observer<T> observer);
//取消订阅
public void unSubscribe(Observer<T> observable);
//告知观察者数据改变
public void notifyObserver(T t);
}
我们的用户比较简单提供一个方法来让公众号告知改变了什么数据。我们来书写一下超类。
//观察者
public interface Observer<T> {
public void updata(T data);
}
接下来我们来进行具体的实现
public class WeChatServer<T> implements Observerable<T> {
public List<Observer<T>> observers ;
public WeChatServer(){
observers = new ArrayList<>();
}
@Override
public void subscribe(Observer<T> observer) {
if(observer!= null && !observers.contains(observer)){
observers.add(observer);
}else if(observer == null){
throw new IllegalArgumentException("observer is null");
}
}
@Override
public void unSubscribe(Observer<T> Observer) {
if(!observers.isEmpty()){
observers.remove(Observer);
}
}
@Override
public void notifyObserver(T t) {
for(int i = 0; i < observers.size(); i++) {
Observer oserver = observers.get(i);
oserver.updata(t);
}
}
//设置数据
public void setData(T data){
notifyObserver(data);
}
}
被观察者提供subscribe方法将观察者放在一个统一的集合当中,主要目的就是在数据改变时,找到所有关注了的用户,告知数据发生了改变。我们可以在notifyObserver方法中看到具体实现。setData方法提供的是改变公众号内容的方法。我们再来实现一下用户部分。
public class User implements Observer<String> {
private String name;
private int age;
public User(String name, int age){
this.name = name;
this.age = age ;
}
@Override
public void updata(String data) {
System.out.println("我是"+name+",我收到了消息data:="+data);
}
}
我们实现updata方法接收到公众号的更新。并打印更新信息,我们来测试一下。
public static void main(String args[]){
WeChatServer<String> observerable = new WeChatServer<>();
Observer<String> observer1 = new User("張三",18);
Observer<String> observer2 = new User("李四",31);
Observer<String> observer3 = new User("王武",11);
Observer<String> observer4 = new User("玉刚",30);
observerable.subscribe(observer1);
observerable.subscribe(observer2);
observerable.subscribe(observer3);
observerable.subscribe(observer4);
observerable.setData("新闻1");
observerable.unSubscribe(observer2);
System.out.println("李四退订");
observerable.setData("新闻2");
}
//结果
我是張三,我收到了消息data:=新闻1
我是李四,我收到了消息data:=新闻1
我是王武,我收到了消息data:=新闻1
我是玉刚,我收到了消息data:=新闻1
李四退订
我是張三,我收到了消息data:=新闻2
我是王武,我收到了消息data:=新闻2
我是玉刚,我收到了消息data:=新闻2
我们可以看到 我们创建了4个用户分别订阅了公众号。都能收到公众号的新闻,当李四退订之后,公众号发的新闻就收不到了。完全符合对观察者模式的定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
网友评论