import java.util.ArrayList;
import java.util.List; /**
* User: HYY
* Date: 13-10-28
* Time: 下午1:34
* To change this template use File | Settings | File Templates.
*/ /**
* 这里使用接口是因为各个观察者可能有各自的独特的方法和属性,因此将其抽象成方法
*/
interface Observer {
void update();
} interface Subject {
void addObserver(Observer observer); void deleteObserver(Observer observer); void notifyObservers();
} class ConcreteObserver implements Observer {
private String ObserverName;
private Subject subject;//一个指向主题的引用, public ConcreteObserver(String ObserverName, Subject subject) {
this.ObserverName = ObserverName;
this.subject = subject;
if (this.subject != null) {
this.subject.addObserver(this);
}
} @Override
public void update() {
//在这个方法中可以通过它,来判断自己关注的数据是否发生变化,并作出相应的行动
System.out.println(ObserverName + " 已经被更新!");
}
} class ConcreteSubject implements Subject {
List<Observer> observerList; public ConcreteSubject() {
this.observerList = new ArrayList<Observer>();
} @Override
public void addObserver(Observer observer) {
if (observer != null) {
if (observerList.contains(observer)) {
System.out.println("已有该观察者,无需添加!");
} else {
observerList.add(observer);
}
}
} @Override
public void deleteObserver(Observer observer) {
observerList.remove(observer);
} @Override
public void notifyObservers() {
for (Observer observer : observerList) {
observer.update();
}
}
} public class MyObserverTest {
public static void main(String[] args) {
//初始化4个观察者和一个被观察对象,构造函数自动将观察的对象附上关系
ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver("观察者(1)", subject);
ConcreteObserver observer2 = new ConcreteObserver("观察者(2)", subject);
ConcreteObserver observer3 = new ConcreteObserver("观察者(3)", subject);
ConcreteObserver observer4 = new ConcreteObserver("观察者(4)", subject); subject.notifyObservers();
}
}

设计模式之观察者(Observer)模式 代码详解的更多相关文章

  1. 设计模式之装饰(Decorator)模式 代码详解

    /** * Created with IntelliJ IDEA. * User: HYY * Date: 13-10-27 * Time: 下午10:49 * To change this temp ...

  2. 设计模式之观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  3. Head First 设计模式 —— 02. 观察者 (Observer) 模式

    思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...

  4. Atitit.设计模式-----触发器模式 trigger  详解

    Atitit.设计模式-----触发器模式 trigger  详解 1. 触发器概念1 1.1. 触发器位置 after|before|instead of1 2. 数据库里面的触发器1 2.1. o ...

  5. 委托与事件代码详解与(Object sender,EventArgs e)详解

    委托与事件代码详解 using System;using System.Collections.Generic;using System.Text; namespace @Delegate //自定义 ...

  6. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  7. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  8. Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测

    Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测 2017年12月13日 17:39:11 机器之心V 阅读数:5931   近日,Artur Suilin 等人发布了 Kaggl ...

  9. Java多线程编程中Future模式的详解<转>

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

随机推荐

  1. JVM笔记7:类加载器

    虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流"这个动作放到Java虚拟机外部实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的代码 ...

  2. verilog 常用系统函数及例子

    1.打开文件 integer file_id; file_id = fopen("file_path/file_name"); 2.写入文件:$fmonitor,$fwrite,$ ...

  3. sklearn两种保存模型的方式

    作者:卢嘉颖 链接:https://www.zhihu.com/question/27187105/answer/97334347 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 1. pic ...

  4. 20160402javaweb 开发模式

    开发案例: 首先,我们确定用xml文件代替数据库,便于测试 建立web工程,基本架构见下图 代码如下: 首先是javabean:User.java package com.dzq.domian; im ...

  5. android 6.0特性翻译 --渣渣

    所有关于Android 6.0 棉花糖的知识 上下文帮助 1.现在按压:不需要离开你正在运行的app或者访问的网站就可 获取帮助,仅仅触摸和按下Home按钮.(长按Home键,可以在 android ...

  6. Cookie / Session / URL重写

    Cookie //创建一个Cookie对象 Cookie cookie = new Cookie("username","JACK"); //在客户端存储的时间 ...

  7. MYSQL连接数据库

    web.config <connectionStrings>   <add name="MysqlDB" connectionString="Data ...

  8. bzoj2653:middle

    思路:首先容易想到二分答案,但如何去check呢,对于一段区间[l,r],把所有小于答案的都赋值为-1,大于等于它的都赋值为1,然后求左端点在[a,b],右端点在[c,d]的最大子串和即可(也就是区间 ...

  9. spring setter方法注入

    <bean id="dao" class="Dao"></bean> <bean id="service" c ...

  10. mysql 事务类型表的用法

    mysql关联表(references)的条件:1.两个表必须是 InnoDB表类型2.使用在外键关系的域必须为索引型(Index)3.使用外键关系的域必须与数据类型相似 以下是父表和子表的例子:创建 ...