`
lgd_java2eye
  • 浏览: 189578 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自己实现观察者模式

阅读更多

观察者模式涉及角色:

 

1)  抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。
2)  抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现。
3)   具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer对象。当它的状态发生改变时, 向它的各个观察者发出通知。
4)  具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject对象的引用。

 

 

/**
 * 
 */
package com.gd.util;

import java.util.Vector;

/**
 * @author Sandy
 * 抽象主题角色
 */
public abstract class Subject {
	private Vector<Observer> observerVector=new Vector<Observer>();
	public void addObserver(Observer observer){
		this.observerVector.add(observer);
	}
	public void deleteObserver(Observer observer){
		this.observerVector.removeElement(observer);
	}
	public void notifyObservers(Object arg){
		Object[] obj=this.observerVector.toArray();
		for (int i=0; i<obj.length;i++) {
			((Observer)obj[i]).update(this,arg);
		}
	}
}

 

 

package com.gd.util;


/**
 * 
 * @author sandy
 * 具体主题角色
 */
public class ConcreteSubject extends Subject {
	public void change(Object object){
			this.notifyObservers(object);
	}
}

 

/**
 * 
 */
package com.gd.util;

/**
 * @author Sandy 抽象观察者角色
 */
public interface Observer {
	void update(Subject subject, Object object);
}

 

/**
 * 
 */
package com.gd.util;

import com.gd.model.News;

/**
 * @author sandy
 * 1号具体观察者角色
 */
public class ConcreteObserver1 implements Observer {

	/* (非 Javadoc)
	 * @see com.gd.uti.Observer#update(com.gd.uti.Subject, java.lang.Object)
	 */
	public void update(Subject subject, Object object) {
		if(object instanceof News){
			News news=(News)object;
			System.out.println("1号订阅者获得的新闻主题为:"+news.getNewsTitle());
		}

	}

}

 

/**
 * 
 */
package com.gd.util;

import com.gd.model.News;

/**
 * @author Sandy
 * 2号具体观察者角色
 */
public class ConcreteObserver2 implements Observer {

	/* (非 Javadoc)
	 * @see com.gd.uti.Observer#update(com.gd.uti.Subject, java.lang.Object)
	 */
	public void update(Subject subject, Object object) {
		if(object instanceof News){
			News news=(News)object;
			System.out.println("2号订阅者获得的新闻主题为:"+news.getNewsTitle());
		}
	}
}

 

实体类:

package com.gd.model;
/**
 * 
 * @author sandy
 *
 */
public class News {
	private String newsTitle;
	private String newsBody;
	
	public News(String newsTitle, String newsBody) {
		super();
		this.newsTitle = newsTitle;
		this.newsBody = newsBody;
	}
	public String getNewsBody() {
		return newsBody;
	}
	public String getNewsTitle() {
		return newsTitle;
	}
	

}

 

客户端测试程序:

package com.gd.uti.test;

import org.junit.Test;

import com.gd.model.News;
import com.gd.util.ConcreteObserver1;
import com.gd.util.ConcreteObserver2;
import com.gd.util.ConcreteSubject;

/**
 * 
 * @author sandy
 * 观察者客户端测试程序
 */
public class Client {
	
	@Test
	public void test(){
		News news=new News("国际新闻..","关于日本扣留中国船长...........");
		ConcreteSubject subject=new ConcreteSubject();
		ConcreteObserver1 observer1=new ConcreteObserver1();
		ConcreteObserver2 observer2=new ConcreteObserver2();
		subject.addObserver(observer1);
		subject.addObserver(observer2);
		subject.change(news);
	}
}

 

 

 

分享到:
评论

相关推荐

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

    - **具体观察者(Concrete Observer)**:实现观察者接口,表示关注具体主题的个体,并定义了一个更新接口的具体实现,当主题状态改变时,会被调用。 3. **工作原理**:当主题对象的状态发生变化时,会调用`notify...

    委托实现观察者模式

    C#语言提供了一种强大的工具——委托,来实现观察者模式。 委托在C#中类似于函数指针,它能够引用方法,并可以在运行时动态地调用这些方法。委托是类型安全的,可以用来传递方法作为参数,或者将方法存储在变量中。...

    C++ 实现观察者模式小例子

    在这个"C++ 实现观察者模式小例子"中,我们看到它被应用到了显示器和报警器这两个组件上,它们根据泵的温度和压力来展示信息或触发警报。 首先,我们需要理解观察者模式的基本结构。在这个模式中,有三个主要角色:...

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

    在Java中,我们可以利用Java提供的内置监听器机制来实现观察者模式,例如`ApplicationListener`和`ApplicationEvent`,这两个类主要用于Swing或JavaFX应用程序中的事件处理。 首先,我们来看`ApplicationListener`...

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

    而在其他语言中,如C#、Python等,也可以轻松实现观察者模式,通过事件或委托机制。 总结来说,观察者模式是一种重要的设计模式,它允许对象在状态改变时自动通知其他对象,从而降低了系统各部分之间的耦合度,提高...

    java实现观察者模式

    在Java中,观察者模式可以通过Java的内置API `java.util.Observable` 和 `java.util.Observer` 类来实现。`Observable` 类代表被观察的对象,而 `Observer` 接口则表示观察者。以下是对这两个关键类的详细解释: 1....

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

    为了实现观察者模式,你需要创建一个实现了`Observer`接口的类,这个类代表具体的观察者。在这个类中,你需要实现`update()`方法,定义当接收到通知时应执行的操作。 接下来,我们可以创建一个具体的`Observable`...

    javascript实现观察者模式

    在JavaScript中,我们可以使用事件驱动模型来实现观察者模式。首先,我们需要创建一个事件中心或者称为事件管理器,这个中心将作为主题,存储所有的观察者。每当有事件发生,事件中心就会触发对应的事件,通知所有...

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

    下面将详细介绍这两个关键组件以及如何使用它们来实现观察者模式。 1. `Observer`接口: - `Observer`接口提供了`update`方法,当被观察的对象状态发生变化时,该方法会被调用。通常,观察者会在这个方法中执行...

    观察者模式 c++ 实现

    在C++中实现观察者模式,通常涉及以下几个关键概念: 1. **主题(Subject)**:主题是被观察的对象,它维护着一个观察者列表,并负责在状态变化时通知这些观察者。在C++中,主题通常是一个类,拥有添加、删除观察者...

    用C#实现观察者模式

    在C#中,我们可以利用.NET框架提供的事件和委托机制来实现观察者模式。本文将深入探讨如何使用C#来实现这一模式。 首先,我们需要理解观察者模式的基本组件:主题(Subject)和观察者(Observer)。主题是被观察的...

    java观察者模式观察者模式

    观察者模式是设计模式中的一种行为模式,它在Java编程中有着广泛的应用。该模式的主要目的是定义对象...在实际开发中,理解并合理运用观察者模式,能够有效地实现对象之间的交互和通信,提升代码的灵活性和可维护性。

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

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

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

    在Java中,观察者模式的实现通常基于Java的内置接口`java.util.Observer`和`java.util.Observable`。下面将详细解释观察者模式的概念、结构以及如何在Java中应用这个模式。 **观察者模式的核心概念:** 1. **主题...

    Qt设计模式之观察者模式

    总结来说,Qt的观察者模式通过信号和槽机制实现了对象间的解耦,使得代码更加模块化,同时也提供了强大的事件处理能力。理解和熟练掌握这一模式,对于编写高效、可维护的Qt应用至关重要。无论是简单的用户界面交互,...

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

    观察者模式的实现方式有很多种,根据不同的应用场景和需求,可以有完全不同的实现方式。下面是一种经典的实现方式: ```java public interface Subject { void registerObserver(Observer observer); void ...

    设计模式-观察者

    在Java中,`java.util.Observable` 和 `java.util.Observer` 类为实现观察者模式提供了基础支持。 1. **主题(Subject)**:主题是被观察的对象,它可以是抽象的或具体的。主题维护了一个观察者列表,并提供了添加...

    一个类实现Android观察者模式(最简单实用的观察者模式)

    如何实现观察者模式 #### 3.1 创建被观察者(Observable) 首先,你需要创建一个被观察的对象,这个对象通常会包含一个或多个可观察的状态变量。在Android中,可以自定义一个类,并添加`Observer`接口的实现,...

Global site tag (gtag.js) - Google Analytics