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. jedis访问redis学习笔记

    最近在学习redis,在网上查了些文章,利用他人已有的知识,总结写下了这篇文章,大部分内容还是引用别人的文章内容.经过测试发现spring-data-redis现在有的版本只能支持reids 2.6和 ...

  2. row_number() OVER (PARTITION BY COL1 ORDER BY COL2)

    select *,ROW_NUMBER() over(partition by deviceID order by RecordDate desc row_number() OVER (PARTITI ...

  3. C语言-求1-20的阶乘的和(函数的递归)

    // //  main.c //  C语言 // //  Created by wanghy on 15/9/5. //  Copyright (c) 2015年 wanghy. All rights ...

  4. WordLight: highlights all occurrences of a selected text for VS2008

    https://visualstudiogallery.msdn.microsoft.com/ad686131-47d4-4c13-ada2-5b1a9019fb6f About This is a ...

  5. js 实现图片旋转角度

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 安装"MySQLdb"一波三折.

    在慕课网学习课程"Python操作MySQL数据库",安装"MySQLdb"时遇到问题. 先是找错地方: 百度搜索"Mysql for Python& ...

  7. ActiveMQ基本配置与示例演示

    一.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 二.运行ActiveMQ 将apache-activemq-5.11.1-bin.zip解压,由于本系 ...

  8. 安装centos 6.7

    安装centos 6.7 系统 首先系统安装引导,本次系统安装是通过虚拟机安装,与真是环境十分接近 系统引导后第一步是询问是否检测硬盘,选择不检测(Skip) 然后等待系统引导进入安装界面,进入后我们 ...

  9. linux指令大全(完整篇)(转)

       http://blog.chinaunix.net/uid-9681606-id-1998590.html  linux指令大全(完整篇)(转) 2009-03-17 01:21:46 分类:  ...

  10. jsonp跨域访问详解

    jsonp是"用来跨域的" 同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 1.随便建两个网 ...