观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。
观察者模式定义
观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。
简单的写了一个demo学习一下观察者模式。
1、Subject 接口
package com.la.observer;
/**
*
* 抽象观察目标
*
*/
public interface Subject {
public void attach(Observer observer);
public void detach(Observer observer);
public void notify(boolean change);
}
2、Observer 接口
package com.la.observer;
/**
*
* 抽象观察者
*
*/
public interface Observer {
public void update(boolean change);
}
3、SiteSubject 具体目标类
package com.la.observer;
import java.util.ArrayList;
import java.util.List;
/**
*
* 具体目标:网站更新,这里可以存储多个观察者,网站更新后一一通知
*
*/
public class SiteSubject implements Subject {
// 用于存储观察者
private List<Observer> list = new ArrayList<Observer>();
@Override
public void attach(Observer observer) {
if (null != observer) {
list.add(observer);
}
}
@Override
public void detach(Observer observer) {
if (!list.isEmpty()) {
list.remove(observer);
}
}
@Override
public void notify(boolean change) {
// 通知所有观察者
for (Observer observer : list) {
observer.update(change);
}
}
}
4、UserObserver 具体观察者类
这是定义的一个用户观察者,当网站更新时,这里的update方法会被回调。
package com.la.observer;
/**
*
* 具体观察者:用户
*
*/
public class UserObserver implements Observer {
@Override
public void update(boolean change) {
// 这里会被回调
}
}
5、总结
在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。
历史上的今天
相关文章
暂无评论...
随机推荐
ActionBar中Menu使用
前言简单记录一下标题栏中Menu的使用。流水文,之前没记录,这次有空重新简单记录一下。正文在Android Studio中新创建一个Module。在res目录创建menu,然后创建一个menu.xml/res/menu/menu.xmlmenu.xml<menu xmlns:a...
OkHttp分析之同步请求
前言接上文网络请求框架OkHttp的同步异步简单使用介绍《OkHttp简单介绍之一》,今天就对同步请求的源码分析一下,加深一下印象。记录一下,方便自己查阅。正文这里用的框架版本implementation 'com.squareup.okhttp3:okhttp:3.12.0'有新版本,...
[摘]Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解
前言最近用Path的moveTo、lineTo、quadTo,也想整理一下,但看到网上已经有人整理了,就摘抄于此,方便自己查阅。好记性不如烂笔头正文一下内容摘抄的,原文请访问文末连接。moveTomoveTo 不会进行绘制,只用于移动移动画笔。就看做移动光标吧。lineTo画线...
AIDL使用异常记录
前言记录一下AIDL中常见的问题,方便自己回忆和学习。正文这里以BookBean为例package com.biumall.binderlibmedia.bean;import android.os.Parcel;import android.os.Parcelable;public...
Seekbar的setThumb使用记录
前言记录一下SeekBar代码设置setThumb的使用。正文xml中Seekbar的配置 <SeekBar android:id="@+id/seek_bar_1" android:layout_width="920dp...
adb shell 命令启动带参数的Activity
前言之前简单整理过《adb命令启动service、Activity和发送Broadcast》,但使用adb启动Activity带参数的没有整理。因此这次想起,记录于此,方便自己查阅。好记性不如烂笔头正文本文主要是整理一下常用的使用adb shell启动带参数的Activity。不带参数启...