`
重庆-卖菜
  • 浏览: 9721 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Java设计模式——观察者模式

 
阅读更多
 

Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种。Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。

Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。


典型应用

 

  1.  侦听事件驱动程序设计中的外部事件
  2. 侦听/监视某个对象的状态变化
  3. 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者
  4. 多线程编程上下游线程协作,即通常所说的一个线程需要等待其它的线程完成某些动作后才能执行。
        a.  JDK自带的CountDownLatch、CyclicBarrier、SemaPhore、Executor、CompletionService都可以达到相同的效果。
        b.  这里面不令人满意的效果是CountDownLatch、CyclicBarrier、SemaPhore都需要等待所有"下游线程(同性质的其它线程)"完成才会执行等待操作后面的任务,导致线程资源浪费。
        c.  执行器相对前面几个效果更好,下游线程不用关心其它下游线程是否完成不会造成等待现象,不过上游线程需要重复获取所有下游线程的状态,直到所有下游线程完成。
        d.  Jdk为解决这个问题提供了CompleteionService和ExecutorCompleteionService来解决执行器重复获取下游线程的问题,这种方式最为优雅、完美)。

 


Observer模式的优点

 

  1. 对象之间可以进行同步通信
  2. 可以同时通知一到多个关联对象
  3. 对象之间的关系以松耦合的形式组合,互不依赖

 

 

 


Observer模式的结构

 

 

  1. JDK1.2后,Java提供了对观察者模式的支持接口和实现类。其中接口 java.util.Observer 用来指定观察者,观察者必须实现 void update(Observable o, Object arg) 方法。而 java.util.Observable 用来指定观察物(被观察者、可被观察的),并且提供了一系列的方法,可以很轻易的使用这个接口和实现类来实现观察者模式。
  2. java.util.Observer 只有一个简单的方法 void update(Observable o, Object arg)。其中,参数 Observable o 用于指定触发 update 方法的对象, Object arg 用于指定触发 update 方法时候的附加参数。

 

 

 


Observer模式的例子

 

/**
 * 观察者模式
 * <p>
 * 被观察的对象。即被观察者监视的对象
 * </p>
 * 
 * @author wangcong
 * @data 2016年6月6日下午3:26:01
 */
public class PayTask extends Observable {
	//支付
	public void pay() {
		System.out.printf("支付指令被调用...\n");
		setChanged();
		notifyObservers();
	}
}
/**
 * 观察者模式
 * <p>
 * 具体的观察者。即:当被观察的对象状态发生变化后,需要做出相应变化或处理的对象
 * </p>
 * 
 * @author wangcong
 * @data 2016年6月6日下午3:21:29
 */
public class PayObserver implements Observer {
	@Override
	public void update(Observable o, Object arg) {
		System.out.printf("发现支付指令被调用,通知客户请求已提交至银行\n");
	}
}

  

 

 

 


Observer模式的多线程应用

一个简单的例子:
/**
 * 观察者模式
 * <p>
 * 被观察的对象。即被观察者监视的对象
 * </p>
 * 
 * @author wangcong
 * @data 2016年6月6日下午3:26:01
 */
public class PayTask extends Observable implements Runnable {
	// 支付
	public void pay() {
		System.out.printf("%s,支付指令被调用...\n", Thread.currentThread().getName());
		setChanged();
		notifyObservers();
	}
	@Override
	public void run() {
		// 为了好查看效果,此处休眠下
		long duration = (long) (Math.random() * 10);
		try {
			TimeUnit.SECONDS.sleep(duration);
			System.out.printf("%s, sleep %d \n", Thread.currentThread().getName(), duration);
		} catch (InterruptedException e) {
			e.printStackTrace();// 此处不作处理
		}
		this.pay();
	}
}
 
/**
 * 观察者模式
 * <p>
 * 具体的观察者。即:当被观察的对象状态发生变化后,需要做出相应变化或处理的对象
 * </p>
 * 
 * @author wangcong
 * @data 2016年6月6日下午3:21:29
 */
public class PayObserver implements Observer {
	// 等待多少线程完成
	private int totalCount = 0;
	private AtomicInteger countNum = null;
	public PayObserver(int count) {
		this.totalCount = count;
		countNum = new AtomicInteger(count);
	}
	@Override
	public void update(Observable o, Object arg) {
		int count = countNum.decrementAndGet();
		if (0 == count) {
			// 处理后续流程
			System.out.printf("所有数据都已调用支付指令,通知客户请求已提交至银行\n");
		} else {
			// no-thing to do
			System.out.printf("应该有%d协作线程,还有%d线程未完成\n", totalCount, countNum.get());
		}
	}
}
 
public class Client {
	public static void main(String[] args) {
		// 数据校要
		// 创建后续业务处理类
		PayObserver po = new PayObserver(10);
		// 创建支付线程
		for (int i = 0; i < 10; i++) {
			PayTask bt = new PayTask();
			bt.addObserver(po); // 添加观察者
			Thread t = new Thread(bt, "pay-" + i);
			t.start();
		}
	}
}
 
运行结果:
 

 
分享到:
评论

相关推荐

    设计模式实现——观察者模式

    在《设计模式实现——观察者模式》这篇博客中,作者可能详细解释了观察者模式的概念、结构以及其在实际编程中的应用。以下是对观察者模式的详细阐述: 1. **模式定义**:观察者模式是一种对象行为型模式,它允许...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    Java与模式——源码

    《Java与模式——源码》这个主题涉及到的是Java编程语言中的设计模式应用,以及如何通过源代码来理解和学习这些模式。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更易读、易维护、...

    java设计模式——告诉新手一些不知道的东西

    在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    《Java设计模式》是刘伟老师的一本经典教材,它深入浅出地讲解了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的通用解决方案,是软件开发中的智慧结晶。这本书的课后习题和...

    深入浅出设计模式二——WeatherData设计(观察者模式)实现一

    在本文中,我们将深入探讨设计模式中的一个经典案例——观察者模式(Observer Pattern),通过具体的实现来理解其工作原理。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况

    本文将深入探讨其中的一种——观察者模式(Observer Pattern)。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 ### ...

    设计模式-观察者

    《设计模式——观察者》 在软件工程中,设计模式是一种在特定情境下解决常见问题的经验总结,它们是经过反复验证的最佳实践。观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖...

    Android 设计模式:(一)观察者模式 —— 封装行为的大局观

    本文将深入探讨其中的一种——观察者模式(Observer Pattern),它是行为设计模式的一种,主要用来封装行为的变化,实现对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被...

    [行为模式]head first 设计模式之观察者模式(observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    设计模式——JAVA.docx

    ### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    Java设计模式源代码——自己看pdf写的

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。在这个压缩包文件“DesignPatterns”中,很可能包含了各种Java设计模式的源代码实现。...

    java设计模式

    22.4.1 Java世界中的观察者模式 22.4.2 项目中真实观察者模式 22.4.3 订阅发布模型 22.5 最佳实践 第23章 门面模式 23.1 我要投递信件 23.2 门面模式的定义 23.3 门面模式的应用 23.3.1 门面模式的优点 23.3.2 门面...

    深入浅出设计模式二——WeatherData设计(观察者模式)实现二

    在本文中,我们将深入探讨设计模式中的"观察者模式",并以`WeatherData`为例进行具体实现。观察者模式是一种行为设计模式,它允许我们定义一个订阅机制,当对象状态发生变化时,可以通知所有依赖它的观察者。这种...

Global site tag (gtag.js) - Google Analytics