版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZhangY1217/article/details/83057650
什么叫观察者模式?
当被观察者的数据更新时,将会通知观察该主题的所有观察者。就像---微信公众号就是被观察者---关注该公众号的就是观察者---》
当公众号更新文章时,关注的人就会获得该信息。这就是观察者模式的应用。
用图说明:
下面将用代码来解释上面的内容:
1.观察者
package com.observer.inter;
/**
* 观察者
* 1.提供更新方法
* @author zy
*
*/
public interface Observer {
void update(String msg);
}
2.被观察者
package com.observer.concretesubject;
/**
* 观察者模式中:被观察者是抽象类,当然接口也可以,但是正宫就是抽象类
* 被观察者
* 1.定义注册观察者方法
* 2.定义移除观察者方法
* 3.通知观察者方法
* 4.发送通知(抽象)
* @author zy
*
*/
import java.util.ArrayList;
import java.util.List;
import com.observer.inter.Observer;
public abstract class ConcreteSubject {
//定义一个集合用来作为观察者者的容器
List<Observer> list=new ArrayList<>();
// 1.定义注册观察者方法
public void registerObserver(Observer ob){
list.add(ob);
}
// 2.定义移除观察者方法
public void removeObserver(Observer ob){
list.remove(ob);
}
// 3.通知观察者方法
protected void notifyObserver(String msg){
for (Observer ob : list) {
ob.update(msg);
}
}
// 4.发送通知(抽象)
public abstract void setInfo(String msg);
}
3.观察者实现类
package com.observer.inter;
/**
* 观察者实现类
* @author zy
*
*/
public class Users implements Observer{
private String name;
public Users(String name) {
this.name=name;
}
@Override
public void update(String msg) {
System.out.println(this.name+":接收到一条信息----》"+msg);
}
}
4.被观察者实现类
package com.observer.test;
import com.observer.concretesubject.ConcreteSubject;
/**
* 仿微信公众号推送消息,被观察者
* @author zy
*
*/
public class WeChatServer extends ConcreteSubject{
//实现消息推送
@Override
public void setInfo(String msg) {
System.out.println("推送信息中。。。。。。");
notifyObserver(msg);
}
}
5.测试类
package com.observer.test;
import com.observer.inter.Users;
public class Test {
public static void main(String[] args) {
//被观察者
WeChatServer weChatServer=new WeChatServer();
//定义观察者
Users u1=new Users("张三");
Users u2=new Users("胡月");
Users u3=new Users("Bob");
//注册观察者--关注公众号
weChatServer.registerObserver(u1);
weChatServer.registerObserver(u2);
weChatServer.registerObserver(u3);
//通知观察者
weChatServer.setInfo("好好学习");
//移除观察者--取消关注
weChatServer.removeObserver(u3);
weChatServer.setInfo("天天向上");
}
}
运行结果:
推送信息中。。。。。。
张三:接收到一条信息----》好好学习
胡月:接收到一条信息----》好好学习
Bob:接收到一条信息----》好好学习
推送信息中。。。。。。
张三:接收到一条信息----》天天向上
胡月:接收到一条信息----》天天向上