观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。
观察者模式定义
观察者模式(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、总结
在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。
历史上的今天
相关文章
暂无评论...
随机推荐
再见,老何
屋子里灯光照耀,屋子外烟雾缭绕。烟灰最终承受不住自身的重量掉落下来。整个夏夜像被人按上了静音键,只有无声的等待。我在屋里,父亲在屋外。日子被日历一页页撕开,而今天是最后一页。我像往常一样追赶着太阳去学校,仿佛我们就代表着初升的朝阳。阳光透过树叶小心翼翼的洒在课桌上,连它都看出来了分别的气息,笔尖划...
Android中UID简介
前言记录一下Android 中UID的相关知识。记录一下,方便自己后续查阅。正文什么是UIDUID就是User ID。Android权限基于Linux,UID也是继承于Linux。每个程序都有一个UID,默认情况下,程序A和程序B的UID是不同的。当然,通过配置sharedUserI...
Android includeFontPadding属性的介绍
前言Android开发中,我们知道TextView显示文本时是存在留白的,如图一的第一行[读书导航],明显比第二行“高大威猛”些。虽然TextView默认存在留白,正常情况下的影响可以忽略不计,但如果换了个别字体后,如图二的第一行[读书导航],加上字体设计也存在留白,导致TextView占用的位...
Android中获得 LayoutInflater 实例的三种方式
以下文章对LayoutInflater总结的不错,摘抄于此,部分内容稍微改动。在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而f...
Android开机动画关闭源码分析
前言记录一下Android开机动画关闭流程,当Launcher[默认是第一个启动的应用]进入前台(onResume())时,会通知系统退出开机动画。当然,除了Launcher,只要是第一个有Activity的应用启动,也是会通知系统退出开机动画的。今天我们就简单分析一下哈。Android ...
余秀华 : 栀子花开
白成一场浩劫,芬芳成一种灾难那些隐匿的声音一层层推出来,一层层堆积,再散开是的,无话可说了白,不是一种色彩。而是一种姿态 每一年,如期而至的突兀:存在即为表达反正是绚烂,反正是到来反正是背负慢慢凋残的孤独:耀眼的孤独义无反顾的孤独 那些喷薄的力从何而来?它...