设计模式之观察者(Observer)模式 代码详解
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)模式 代码详解的更多相关文章
- 设计模式之装饰(Decorator)模式 代码详解
/** * Created with IntelliJ IDEA. * User: HYY * Date: 13-10-27 * Time: 下午10:49 * To change this temp ...
- 设计模式之观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- Head First 设计模式 —— 02. 观察者 (Observer) 模式
思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...
- Atitit.设计模式-----触发器模式 trigger 详解
Atitit.设计模式-----触发器模式 trigger 详解 1. 触发器概念1 1.1. 触发器位置 after|before|instead of1 2. 数据库里面的触发器1 2.1. o ...
- 委托与事件代码详解与(Object sender,EventArgs e)详解
委托与事件代码详解 using System;using System.Collections.Generic;using System.Text; namespace @Delegate //自定义 ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测
Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测 2017年12月13日 17:39:11 机器之心V 阅读数:5931 近日,Artur Suilin 等人发布了 Kaggl ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
随机推荐
- 衣联网络-亿能测试 安全测试沙龙 PPT资料免费下载
衣联网络-亿能测试 安全测试沙龙 PPT资料免费下载http://automationqa.com/forum.php?mod=viewthread&tid=2304&fromuid= ...
- hihocoder 第一周 最长回文字串
题目1 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程 ...
- C++学习(五)
一.拷贝构造函数和拷贝赋值运算符1.拷贝构造:用一个已有的对象,构造和它同类型的副本对象——克隆.2.形如class X { X (const X& that) { ... }};的构造函数 ...
- DNS加速之“智能DNS”跟“双线加速”、“CDN加速”的区别
“智能DNS”跟“双线加速”.“CDN加速”的区别相信,很大部分IDC用户可能还没弄清楚状况,有人觉得智能DNS跟双线加速.CDN加速是类似的技术.其实不然,它们在工作方式上有着本质的区别,但它们又可 ...
- 【MINA】字节序知识
字节序,分为高位在前和低位在前,说白了就是先从低操作还是从高位操作 java和网络的字节序是一致的,都是高位在前,这意味着java端序列化和反序列化时不用关心字节序的问题, 那问题是,那讨论字节序有什 ...
- 20151211jquery ajax进阶代码备份
//数据处理 $('form input[type=button]').click(function() { //json处理 /*$.ajax({ type:'POST', url:'test.js ...
- SQL server 2012 如何取上个月的最后一天
好吧 QQ群里被问到这种问题,还是这里写一下吧. DECLARE @date DATETIME = getdate(); SELECT EOMONTH (@date) AS 'Last Day Of ...
- 经典SQL语句大全(绝对的经典)
”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度3,right(char_expr,int_expr) 返回字符串右边第int_expr个字符, ...
- Linux搭建SSH服务器
Linux 远程登录服务:ssh ·SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Te ...
- JavaScript之Function类型
1. 创建方式 //1.函数声明 function sum(num1,num2){ return num1+num2; } //2.函数表达式 var sum = function(num1,num2 ...