博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android常用设计模式--观察者模式
阅读量:4135 次
发布时间:2019-05-25

本文共 3235 字,大约阅读时间需要 10 分钟。

观察者模式常用于只要改变一个内容,其他的一个或多个内容也会随之改变。

例如需求:公司行政通知开会,领导需要准备发言,秘术做好会议记录,员工需要认真听讲。
这种需求使用观察者模式实现最合理。
观察者模式实现有两种方式,
方式一、使用Api直接提供的接口,我们只要实现它即可。
方式二、自定义一个观察者接口、被观察着接口、被观察者主体、观察者主体。

方式一简单代码实现:

1、定义被观察者类,继承Observable
需要观察的对象

public class MeetingObservable extends Observable {
public void startMeeting(String msg){
setChanged(); notifyObservers(msg); }}

2、定义观察者类,实现Observer接口

当需要观察的对象发生改变是,观察者需要作出的变化。

public class SecretaryObserver implements Observer {
@Override public void update(Observable observable, Object o) {
Log.d("Secretary","接收到会议指令 "+o.toString() + " 秘术记录会议内容"); }}public class LeadObserver implements Observer {
@Override public void update(Observable observable, Object o) {
Log.d("Lead",o.toString() + " 领导发言 "); }}public class EmployeeObserver implements Observer {
@Override public void update(Observable observable, Object o) {
Log.d("Employee",o.toString() + " 员工听讲"); }}

3、使用方法

private void test(){
MeetingObservable observable = new MeetingObservable(); SecretaryObserver secretary = new SecretaryObserver(); LeadObserver lead = new LeadObserver(); EmployeeObserver employee = new EmployeeObserver(); observable.addObserver(secretary); observable.addObserver(lead); observable.addObserver(employee); observable.startMeeting("开始会议"); }
  • 当退出的时候必须调用 observable.deleteObservers() 取消观察者

方式二简单实现

1、定义观察者接口
用来更新观察者对象

public interface MyObserver {
public void upDate(Object object);}

2、定义被观察者接口

public interface MyObservable {
public void addObserver(MyObserver observer); public void delObserver(MyObserver observer); public void delObservers(); public void notifyObserver(Object object);}

3、定义被观察者主体

该方法主要用于添加、删除观察者,以及通知各个观察者进行更新。

public class Meeting implements MyObservable{
List
mList = new ArrayList<>(); @Override public void addObserver(MyObserver observer) {
if (observer != null){
mList.add(observer); } } @Override public void delObserver(MyObserver observer) {
if (observer != null){
mList.remove(observer); } } @Override public void delObservers() {
if (mList != null && mList.size() > 0){
mList.clear(); } } @Override public void notifyObserver(Object object) {
for (MyObserver observer : mList){
observer.upDate(object); } }}

4、定义观察者主体

实现观察者接口,实现各个观察者接收到通知消息后需要进行的操作。

public class Employee implements MyObserver {
@Override public void upDate(Object object) {
Log.d("employee", object.toString() + " 各位员工注意听讲"); }}public class Manager implements MyObserver {
@Override public void upDate(Object object) {
Log.d("manager", object.toString() + " 领导讲话 "); }}

5、使用方法

private void test(){
Meeting meeting = new Meeting(); Manager manager = new Manager(); Employee employee = new Employee(); meeting.addObserver(manager); meeting.addObserver(employee); meeting.notifyObserver("员工大会现在开始"); //使用完毕之后需要消除观察者 meeting.delObservers(); }

转载地址:http://hnsvi.baihongyu.com/

你可能感兴趣的文章
含有指针类的拷贝
查看>>
通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小
查看>>
第四章 微信飞机大战
查看>>
九度:题目1008:最短路径问题
查看>>
九度Online Judge
查看>>
九度:题目1027:欧拉回路
查看>>
九度:题目1012:畅通工程
查看>>
九度:题目1017:还是畅通工程
查看>>
九度:题目1034:寻找大富翁
查看>>
第五章 图着色问题
查看>>
第六章 背包问题——01背包
查看>>
第七章 背包问题——完全背包
查看>>
51nod 分类
查看>>
1174 . 区间中最大的数
查看>>
1136 . 欧拉函数
查看>>
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
State模式
查看>>
Observer模式
查看>>