设计模式 观察者模式 以微信公众服务为例

private List observers = new ArrayList();

/**

  • 3D彩票的号码

*/

private String msg;

@Override

public void registerObserver(Observer observer)

{

observers.add(observer);

}

@Override

public void removeObserver(Observer observer)

{

int index = observers.indexOf(observer);

if (index >= 0)

{

observers.remove(index);

}

}

@Override

public void notifyObservers()

{

for (Observer observer : observers)

{

observer.update(msg);

}

}

/**

  • 主题更新消息

  • @param msg

*/

public void setMsg(String msg)

{

this.msg = msg;

notifyObservers();

}

}

模拟两个使用者:

package com.zhy.pattern.observer;

public class Observer1 implements Observer

{

private Subject subject;

public Observer1(Subject subject)

{

this.subject = subject;

subject.registerObserver(this);

}

@Override

public void update(String msg)

{

System.out.println(“observer1 得到 3D 号码 -->” + msg + “, 我要记下来。”);

}

}

package com.zhy.pattern.observer;

public class Observer2 implements Observer

{

private Subject subject ;

public Observer2(Subject subject)

{

this.subject = subject ;

subject.registerObserver(this);

}

@Override

public void update(String msg)

{

System.out.println(“observer2 得到 3D 号码 -->” + msg + “我要告诉舍友们。”);

}

}

可以看出:服务号中维护了所有向它订阅消息的使用者,当服务号有新消息时,通知所有的使用者。整个架构是一种松耦合,主题的实现不依赖与使用者,当增加新的使用者时,主题的代码不需要改变;使用者如何处理得到的数据与主题无关;

最后看下测试代码:

package com.zhy.pattern.observer.test;

import com.zhy.pattern.observer.ObjectFor3D;

import com.zhy.pattern.observer.Observer;

import com.zhy.pattern.observer.Observer1;

import com.zhy.pattern.observer.Observer2;

import com.zhy.pattern.observer.Subject;

public class Test

{

public static void main(String[] args)

{

//模拟一个3D的服务号

ObjectFor3D subjectFor3d = new ObjectFor3D();

//客户1

Observer observer1 = new Observer1(subjectFor3d);

Observer observer2 = new Observer2(subjectFor3d);

subjectFor3d.setMsg(“20140420的3D号码是:127” );

subjectFor3d.setMsg(“20140421的3D号码是:333” );

}

}

observer1 得到 3D 号码 -->20140420的3D号码是:127, 我要记下来。

observer2 得到 3D 号码 -->20140420的3D号码是:127我要告诉舍友们。

observer1 得到 3D 号码 -->20140421的3D号码是:333, 我要记下来。

observer2 得到 3D 号码 -->20140421的3D号码是:333我要告诉舍友们。

对于JDK或者Andorid中都有很多地方实现了观察者模式,比如XXXView.addXXXListenter , 当然了 XXXView.setOnXXXListener不一定是观察者模式,因为观察者模式是一种一对多的关系,对于setXXXListener是1对1的关系,应该叫回调。

恭喜你学会了观察者模式,上面的观察者模式使我们从无到有的写出,当然了java中已经帮我们实现了观察者模式,借助于java.util.Observable和java.util.Observer。

下面我们使用Java内置的类实现观察者模式:

首先是一个3D彩票服务号主题:

package com.zhy.pattern.observer.java;

import java.util.Observable;

public class SubjectFor3d extends Observable

{

private String msg ;

public String getMsg()

{

return msg;

}

/**

  • 主题更新消息

  • @param msg

*/

public void setMsg(String msg)

{

this.msg = msg ;

setChanged();

notifyObservers();

}

}

下面是一个双色球的服务号主题:

package com.zhy.pattern.observer.java;

import java.util.Observable;

public class SubjectForSSQ extends Observable

{

private String msg ;

public String getMsg()

{

return msg;

}

/**

  • 主题更新消息

  • @param msg

*/

public void setMsg(String msg)

{

this.msg = msg ;

setChanged();

notifyObservers();

}

}

最后是我们的使用者:

package com.zhy.pattern.observer.java;

import java.util.Observable;

import java.util.Observer;

public class Observer1 implements Observer

{

public void registerSubject(Observable observable)

{

observable.addObserver(this);

}

@Override

public void update(Observable o, Object arg)

{

if (o instanceof SubjectFor3d)

{

SubjectFor3d subjectFor3d = (SubjectFor3d) o;

System.out.println(“subjectFor3d’s msg – >” + subjectFor3d.getMsg());

}

if (o instanceof SubjectForSSQ)

{

SubjectForSSQ subjectForSSQ = (SubjectForSSQ) o;

System.out.println(“subjectForSSQ’s msg – >” + subjectForSSQ.getMsg());

}

}

}

看一个测试代码:

package com.zhy.pattern.observer.java;

总结

作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!

资料.png
资料图.jpg
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
o;

System.out.println(“subjectForSSQ’s msg – >” + subjectForSSQ.getMsg());

}

}

}

看一个测试代码:

package com.zhy.pattern.observer.java;

总结

作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!

[外链图片转存中…(img-YMicG48a-1715393699819)]
[外链图片转存中…(img-J1aOfyOW-1715393699819)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值