Android设计模式之观察者模式
Android设计模式之观察者模式
所谓的观察者模式,就是观察者和被观察者之间的关系问题。用一个简单的生活案例来说明,观察者是我们订报纸的人,被观察者是报纸社,只要我们订阅了报纸,当有新的新闻出来的时候,报纸社就会印发报纸来通知我。这就是简单的观察者模式。
- Subject
- MyTopic implements Subject
- Observers
- MyTopicSubscriber implements Observers
- ObserverPatternTest
Subject接口
/**
*
* @author观察者模式
* 观察者模式是一种行为设计模式。观察者模式的用途是,当你对一个对象感兴趣的时候
* 希望在它每次发生变化的时候获得通知。在观察者模式中,观察另外一个对象状态的对象叫做
* Observer观察者,被观察的对象叫做Subject被观察者。
*/
public interface Subject {
// 基于Subject被观察者的需求
// 这个是实现一个基本的Subject接口,
// 此接口定了一系列具体的方法需要在随后实现接口的具体类中被实现。
public void register(Observers obj);
//注销一个观察者
public void unregister(Observers obj);
//通知所有的观察者
public void notifyObservers();
public Object getUpdate(Observers obj);
}
MyTopic implements Subject
public class MyTopic implements Subject{
/**
*具体的被观察的主题
*/
private ArrayList<Observers> observerss;//所有观察者的集合
private String message ; //变化的消息
private boolean changed = false;
private final Object MUTEX = new Object();
public MyTopic(){
this.observerss = new ArrayList<Observers>(); //初始化的时候新建一个放观察者的集合
}
public void register(Observers obj) {
if(obj == null) throw new NullPointerException("Null Observer");
if(!observerss.contains(obj))
observerss.add(obj);
}
public void unregister(Observers obj) {
observerss.remove(obj);
}
/*其实在这里我们可以推出listview中的NotifyDataSetChanged()
也是当集合或者数组更新的时候,通知每一个观察者去更新,从这里我们明白listview 中的adapter其实也是一个观察者模式
*/
public void notifyObservers() {
ArrayList<Observers> observerslocal = null;
synchronized (MUTEX) {//此处传一个Object的对象就可以
if (!changed) {
return;
}else {
observerslocal = observerss;
this.changed = false ;
}
//这里就是用一个for循环,向每个以及该注册的观察发送消息
for (Observers obj:observerslocal) {
obj.update();
}
}
}
public Object getUpdate(Observers obj) {
// TODO Auto-generated method stub
return this.message;
}
public void postMessage(String msg){
System.out.println("Message Posted to Topic:"+msg);
this.message=msg;
this.changed=true;
notifyObservers();
}
}
Observer
public interface Observers {
//method to update the observer,used by subject
public void update();
//attach with subject to observe
public void setSubject(Subject su);
}
MyTopicSubscriber implements Observers
public class MyTopicSubscriber implements Observers{
private String name;
private Subject topic ;
public MyTopicSubscriber(String nm){
this.name=nm;
}
public void update() {
String msg = (String) topic.getUpdate(this);
if (msg==null) {
System.out.println(name+":: No new message");
}else{
System.out.println(name+":: Consuming message::"+msg);
}
}
public void setSubject(Subject su) {
this.topic=su;
}
测试类
public class ObserverPatternTest {
/**
* @param args
*/
public static void main(String[] args) {
MyTopic topic = new MyTopic();//观测的主题 注册和删除观察者
//下面是具体的四个观察者
Observers obj1 = new MyTopicSubscriber("Obj1");
Observers obj2 = new MyTopicSubscriber("Obj2");
Observers obj3 = new MyTopicSubscriber("Obj3");
Observers obj4 = new MyTopicSubscriber("hongbiao");
//观察主题将四个观察者添加进去
topic.register(obj1);
topic.register(obj2);
topic.register(obj3);
topic.register(obj4);
obj1.setSubject(topic);
obj2.setSubject(topic);
obj3.setSubject(topic);
obj4.setSubject(topic);
obj1.update();
topic.postMessage("New Message");//更新的消息
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)