`
巴赫的梦幻
  • 浏览: 74201 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

观察者模式

 
阅读更多
观察者模式在JDK中有了很好的支持,目前,开发者使用JDK提供的观察者模式有两种途径。
1. 被观察者继承Observerable父类;观察者实现Oberver接口。
2. 在EventObject中封装消息参数;然后,在EventListenr中实现监听者(观察者)的动作。

首先来看采用Observable实现的观察者模式。
在这个例子中,我们将以“北朝鲜”作为一个被观察者,而北朝鲜的一举一动都影响的着半岛的稳定。而中美作为世界的两个大国,更是时刻关注者北朝鲜的一举一动。因此,中国和美国,各自都是观察者。而北朝鲜的关注点,无非是“原子弹”和“金正日同志的健康”。因此,如果,朝鲜宣布,核爆成功,那么,这两个观察者就会分别发表声明;如果,金正日死了,那么,两个观察者在观察到这个消息之后,也会做出不同的表态。

封装了半岛局势的枚举:
/**
 * 朝鲜半岛的关注点。
 * 
 * @author hongxin.xu
 * @version $Id: PeninsulaEnum.java, v 0.1 2012-1-2 下午3:46:10 hongxin.xu Exp $
 */
public enum PeninsulaEnum {

    /** 试爆成功。 */
    NUCLEAR,

    /** 金哥Bye! */
    KIMJIONIIDEAD;

}


被观察者(北朝鲜的实例),这里需要注意的是,被观察者,必须要继承Observable父类。该父类中提供了“添加监听器”、“删除监听器”、“触发监听器”的方法。注意,在触发监听器操作之前,必须设置变更状态。否则,监听器将不会被触发。
/**
 * 被观察者的实例。
 * <p>
 * 伟大的北朝鲜政权,是世界各国关注的焦点。 因此,在这里将其作为一个被观察者的实例。
 * </p>
 * 
 * @author hongxin.xu
 * @version $Id: ChinaObserver.java, v 0.1 2012-1-2 下午3:14:53 hongxin.xu Exp $
 */
public class NorthKoreaSubject extends Observable {
	public static void main(String[] args) {
		// 声明两个观察者。
		Observer china = new ChinaObserver();
		Observer american = new AmericanObserver();

		// 添加观察者
		NorthKoreaSubject northKoreaSubject = new NorthKoreaSubject();
		northKoreaSubject.addObserver(china);
		northKoreaSubject.addObserver(american);

		// 触发事件。
		System.out.println("Kim-Jong-II:我们有原子弹了思密达!");
		northKoreaSubject.setPeninsulaEnum(PeninsulaEnum.NUCLEAR);

		// 触发事件。
		System.out.println("Kim-Jong-II:我挂了~~~");
		northKoreaSubject.setPeninsulaEnum(PeninsulaEnum.KIMJIONIIDEAD);

	}

	/**
	 * @param peninsulaEnum
	 *            the peninsulaEnum to set
	 */
	public void setPeninsulaEnum(PeninsulaEnum peninsulaEnum) {
		// 设置状态位。
		super.setChanged();

		// 触发notify事件。
		super.notifyObservers(peninsulaEnum);
	}
}


下面给出两个观察者的实例:
1.中国
/**
 * 中国作为一个观察者,时时刻刻关注着北朝鲜的动态。
 * 
 * @author hongxin.xu
 * @version $Id: ChinaObserver.java, v 0.1 2012-1-2 下午3:19:39 hongxin.xu Exp $
 */
public class ChinaObserver implements Observer {

    /**
     * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
     */
    @Override
    public void update(Observable o, Object arg) {
        if (arg instanceof PeninsulaEnum) {
            PeninsulaEnum msg = (PeninsulaEnum) arg;
            if (msg == PeninsulaEnum.KIMJIONIIDEAD) {
                System.out.println("  --中国外交部发来唁电");
            }
            if (msg == PeninsulaEnum.NUCLEAR) {
                System.out.println("  --中国外交部表示谴责!");
            }
        }
    }

}


2.美国
public class AmericanObserver implements Observer {

    /**
     * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
     */
    @Override
    public void update(Observable o, Object arg) {
        if (arg instanceof PeninsulaEnum) {
            PeninsulaEnum msg = (PeninsulaEnum) arg;
            if (msg == PeninsulaEnum.KIMJIONIIDEAD) {
                System.out.println("  --白宫表示毫无压力");
            }
            if (msg == PeninsulaEnum.NUCLEAR) {
                System.out.println("  --白宫很生气,后果很严重");
            }
        }
    }

}


至此,我们就利用Observable实现了一个观察者模式。其运行的结果为:
Kim-Jong-II:我们有核原子弹了思密达!
  --白宫很生气,后果很严重
  --中国外交部表示谴责!
Kim-Jong-II:我挂了~~~
  --白宫表示毫无压力
  --中国外交部发来唁电


以上是采用Observer/Observerable实现的观察者模式。在JDK中还有另外的一种,实现观察者模式的方法,那就是使用EventObject和EventListener。还是采用“北朝鲜”的例子,我们来进行说明:
首先,定义半岛局势的枚举
/**
 * 定义半岛局势的枚举
 * 
 * @author ibm
 * 
 */
public enum PeninsulaEnum {
	UNCLEAN, KIMJIONIIDEAD;
}


然后,在PeninsulaSituation中封装对该枚举的引用。同时,实现的状态的设置。
/**
 * 半岛局势实例。
 * 
 * @author ibm
 * 
 */
public class PeninsulaSituation extends EventObject {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/** 半岛枚举。 */
	private PeninsulaEnum peninsulaEnum;

	public PeninsulaSituation(Object source) {
		super(source);
		// TODO Auto-generated constructor stub
		if (source instanceof PeninsulaEnum) {
			peninsulaEnum = (PeninsulaEnum) source;
		}
	}

	/**
	 * @return the peninsulaEnum
	 */
	public PeninsulaEnum getPeninsulaEnum() {
		return peninsulaEnum;
	}

	/**
	 * @param peninsulaEnum
	 *            the peninsulaEnum to set
	 */
	public void setPeninsulaEnum(PeninsulaEnum peninsulaEnum) {
		this.peninsulaEnum = peninsulaEnum;
	}

}


与采用Observer的方式不同,如果使用EventListener来进行观察。那么,就必须自己来实现观察者的管理和触发。因此,这里给出如下的观察者的实现:
/**
 * 被观察者实例。
 * 
 * @author ibm
 * 
 */
public class NorthKoreaSubject {
	/** 保存观察者实例的容器。 */
	private final Vector repo = new Vector();

	/**
	 * 添加事件监听器。
	 * 
	 * @param eventListener
	 */
	public synchronized void addEventListener(EventListener eventListener) {
		repo.addElement(eventListener);
	}

	public void notifyListener(EventObject e) throws IllegalAccessException {
		Object[] localArr;

		if (repo == null) {
			throw new IllegalAccessException("Vector is empty");
		}

		synchronized (this) {
			if (!repo.isEmpty()) {
				localArr = repo.toArray();
				for (Object element : localArr) {
					((GovernmentListener) element).handler(e);
				}
			}
		}
	}
}


至此,被观察者的实现完成了。下面对观察者的实现进行介绍。首先,EventListener是一个没有任何方法的标识接口,为了能够表示观察者需要统一完成的动作,我们需要自定出一个接口,该接口继承自EventListener接口。
/**
 * 监听器实例。
 * 
 * @author ibm
 * 
 */
public interface GovernmentListener extends EventListener {
	/** 接口中包含了事件对象。 */
	void handler(EventObject e);
}


同样,中国和美国分别是这两个接口的实现。
/**
 * 监听器的实现,中国。
 * @author ibm
 *
 */
public class ChinaEventListener implements GovernmentListener {

	@Override
	public void handler(EventObject e) {
		// TODO Auto-generated method stub
		if (e instanceof PeninsulaSituation) {
			PeninsulaEnum situation = ((PeninsulaSituation) e)
					.getPeninsulaEnum();
			if (situation == PeninsulaEnum.KIMJIONIIDEAD) {
				System.out.println("  --中国外交部发来唁电");
			}
			if (situation == PeninsulaEnum.UNCLEAN) {
				System.out.println("  --中国外交部表示谴责");
			}
		}
	}

}


/**
 * 监听器的实现,美国。
 * 
 * @author ibm
 * 
 */
public class AmericanEventListener implements GovernmentListener {

	@Override
	public void handler(EventObject e) {
		// TODO Auto-generated method stub
		if (e instanceof PeninsulaSituation) {
			PeninsulaEnum situation = ((PeninsulaSituation) e)
					.getPeninsulaEnum();
			if (situation == PeninsulaEnum.KIMJIONIIDEAD) {
				System.out.println("  --白宫表示毫无压力");
			}
			if (situation == PeninsulaEnum.UNCLEAN) {
				System.out.println("  --白宫很生气,后果很严重");
			}
		}
	}

}


下面是测试类
/**
 * 事件监听器启动实例。
 * 
 * @author ibm
 * 
 */
public class EventListenerStartDemo {
	private final static NorthKoreaSubject subject = new NorthKoreaSubject();

	public static void main(String[] args) {

		try {
			EventListener china = new ChinaEventListener();
			EventListener american = new AmericanEventListener();

			subject.addEventListener(china);
			subject.addEventListener(american);

			EventObject event1 = new PeninsulaSituation(
					PeninsulaEnum.KIMJIONIIDEAD);
			EventObject event2 = new PeninsulaSituation(PeninsulaEnum.UNCLEAN);

			System.out.println("Kim Jong II -- 我挂了");
			subject.notifyListener(event1);

			System.out.println("Kim Jong II -- 我们有原子弹了思密达");
			subject.notifyListener(event2);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}


其执行的结果是:
Kim-Jong-II:我们有核原子弹了思密达!
  --白宫很生气,后果很严重
  --中国外交部表示谴责!
Kim-Jong-II:我挂了~~~
  --白宫表示毫无压力
  --中国外交部发来唁电


以上是放假,闲来无事自娱自乐的一些整理,希望大家拍砖!
分享到:
评论

相关推荐

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

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

    java 设计模式 观察者模式 简单实例 包括测试test类

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

    Qt设计模式之观察者模式

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

    java观察者模式观察者模式

    观察者模式是设计模式中的一种行为模式,它在Java编程中有着广泛的应用。该模式的主要目的是定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式也被...

    设计模式-观察者模式(讲解及其实现代码)

    观察者模式,也被称为发布-订阅模式,是软件设计中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在分布式系统、事件驱动...

    Java内置观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的其他对象。在Java中,这种模式已经被内置到语言核心,使得开发者可以轻松地实现事件驱动...

    设计模式--观察者模式java例子

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

    观察者模式模版和例子

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

    设计模式之观察者模式Java实现

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

    运用MVC模式及观察者模式的java小程序

    在这个名为“运用MVC模式及观察者模式的java小程序”的项目中,我们重点探讨了两种经典的设计模式:Model-View-Controller(MVC)模式和Observer(观察者)模式。这两种模式在JavaWeb开发中扮演着至关重要的角色。 ...

    iOS 设计模式 观察者模式

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为模式。在iOS开发中,它是一种让多个对象监听或订阅某一个主题对象的状态变化,并在状态变化时自动收到通知的方式。这种模式使得...

    56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1

    观察者模式详解 观察者模式(Observer Design Pattern)是行为型设计模式的一种,主要解决的是“类或对象之间的交互”问题。它定义了一个一对多的依赖关系,当一个对象的状态改变时,所有依赖的对象都会自动收到...

    观察者模式编写的股票分析程序

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在这个"股票分析程序"中,我们很显然看到它利用了这种模式来实时更新股票...

    设计模式之观察者模式

    观察者模式是面向对象设计中的一种经典模式,它在软件工程中扮演着重要的角色,用于实现对象间的松耦合。这种模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    观察者模式源码

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

    观察者模式代码

    观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java或其他面向对象语言中,这种模式通常用于实现事件处理或发布/订阅系统。在给定的“观察者...

    观察者模式练习

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

    Unity3D设计模式之观察者模式

    ### Unity3D设计模式之观察者模式 #### 观察者模式概述 观察者模式(Observer Pattern)是一种软件设计模式,属于行为型模式之一。它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它...

    观察者模式的一个应用

    ### 观察者模式概述与应用 #### 一、观察者模式定义 观察者模式是一种常用的软件设计模式,主要用于处理对象间的依赖关系。在这种模式下,一个对象(称为“主题”或“被观察者”)负责维护一组依赖于它的对象...

Global site tag (gtag.js) - Google Analytics