`
Strive_sprint
  • 浏览: 21711 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

j2ee常用设计模式之观察者模式

 
阅读更多

 

1.什么是观察者模式

      定义对象间的一种一对多的关系,当一个对象的状态发生改变的时候,所有依赖于它的其他对象都将得到通知并自动更新。

 

2.观察者模式结构中的四种角色

      抽象主题(Subject):抽象主题是一个接口(或类或抽象类),该接口规定了具体主题需要实现的方法。

      抽象观察者(Observer):抽象观察者是一个接口(或类或抽象类),该接口规定了具体观察者用来更新数据的方法。

      具体主题(ConcreteSubject):具体主题是实现(继承)抽象主题接口的一个实例,存放观察者对象,当状态发生改变的时候,通知各个观察者。

      具体观察者(ConcreteObserver):具体观察者是实现(继承)抽象观察者接口的实例,存放有关状态。

 

3.观察者模式的优点

      ①.观察者模式在被观察者和观察者之间建立一个抽象的耦合。主题角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。主题并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。

      ②.观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知。

 

4.观察者模式的缺点

      ①.如果一个主题有很多观察者观察,那么当主题改变的时候,通知所有的观察者会花费很多的时间。

      ②.虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的

 

废话说了这么多,用了才知道。下面是一个奇数观察者和偶数观察者观察产生随机数的主题,并选择自己需要的数:

 

抽象主题:

public interface Subject {
	//添加观察者
	public void addObserver(Observer o);
	//删除观察者
	public void deleteObserver(Observer o);
	//通知观察者更新
	public void notifyObservers();
}

 

抽象观察者:

public interface Observer {
	//更新方法
	public void update();
}

 

具体主题(随机数产生类):

public class RandomNumberSubject implements Subject{
	//用来存储具体观察者对象
	private ArrayList<Observer> observers = new ArrayList<>();;
	//产生的随机数
	private int number;
	@Override
	public void addObserver(Observer o) {
		if(!(observers.contains(o))){
			observers.add(o);
		}
	}
	@Override
	public void deleteObserver(Observer o) {
		if(observers.contains(o)){
			observers.remove(o);
		}
	}
	@Override
	public void notifyObservers() {
		//遍历出每个观察者,并更新
		for(int i = 0;i<observers.size();i++){
			Observer observer = observers.get(i);
			observer.update();
		}
	}
	//产生随机数,并通知观察者更新
	public void generateNum(){
		//产生10个随机数
		for(int i = 0;i<10;i++){
			//产生10以内的随机数
			Random random = new Random();
			number = random.nextInt(10);
			//通知观察者
			notifyObservers();
		}
	}
	//得到产生的随机数
	public int getNumber(){
		return number;
	}
}

 

具体观察者1(奇数观察者):

public class ObserverOdd_number implements Observer{
	//观察者所观察的主题
	Subject subject;
	//构造函数
	public ObserverOdd_number(Subject subject){
		this.subject = subject;
		//添加观察者
		subject.addObserver(this);
	}
	@Override
	public void update() {
		//判断是否具体主题的对象
		if(subject instanceof RandomNumberSubject){
			//得到产生的随机数
			int number = ((RandomNumberSubject) subject).getNumber();
			//选择需要的奇数
			if(number%2 != 0){
				System.out.println("奇数观察者所观察到的数是:"+number);
			}
		}
	}
}

 

具体观察者2(偶数观察者):

public class ObserverEven_number implements Observer{
	Subject subject;
	public ObserverEven_number(Subject subject){
		this.subject = subject;
		subject.addObserver(this);
	}
	@Override
	public void update() {
		if(subject instanceof RandomNumberSubject){
			int number = ((RandomNumberSubject) subject).getNumber();
			if(number%2 == 0){
				System.out.println("偶数观察者所观察到的数是:"+number);
			}
		}
	}
}

 

   测试类:

public class ObserverTest {
	public static void main(String [] args){
		//具体主题对象
		RandomNumberSubject rn = new RandomNumberSubject();
		//具体观察者
		ObserverOdd_number oon = new ObserverOdd_number(rn);
		ObserverEven_number oen = new ObserverEven_number(rn);
		//调用产生随机数的方法
		rn.generateNum();
	}
}

 

结果:

奇数观察者所观察到的数是:5
偶数观察者所观察到的数是:4
偶数观察者所观察到的数是:8
奇数观察者所观察到的数是:9
偶数观察者所观察到的数是:6
奇数观察者所观察到的数是:9
偶数观察者所观察到的数是:0
偶数观察者所观察到的数是:4
奇数观察者所观察到的数是:3
偶数观察者所观察到的数是:8

      测试类中只是调用了具体主题产生随即数的方法,各个观察者就随之更新了自己的状态。

 

      当然也可以有一个观察者依赖多主题,只是多了一个具体主题类,只需要在观察者类中得到相关信息,然后根据自己的要求更新自己就可以了。这个不再多说。

 

      其实java自己也提供了相关的类和接口供我们实现观察者模式,在java.util包中,提供了Observable类和Observer接口。其实Observable类就相当于主题接口,继承Observable的子类实例就是一个主题;Observer接口就是抽象观察者,实现该接口的类实例就是一个观察者。只是Observable类是用Vector(在集合框架中分析了Vector和ArrayList的区别)来存放具体观察者,其他都是一样的,所以不多说,感兴趣的同学可以自己查API,然后写写程序。

分享到:
评论

相关推荐

    23种JAVA设计模式和15种J2EE设计模式

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ...

    j2ee观察者模式&课件ppt

    j2ee 观察者模式 附ppt 在日常生活中,常常会用这样的情形:当某件事发生时,应该通知所有的相关者。例如,如果我们的课程改变时间或地点,就应该通知所有选修了这门课程的同学。 在软件设计中,也有类似的问题:当...

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    33种JAVA设计模式DEMO

    观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计...

    二十三种设计模式【PDF版】

    设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer 设计模式之 Iterator(迭代器) 这个模式已经被整合入Java的Collection.在大多数场合下无需自己制造一个Iterator,只要将对象装入...

    python36patterns:最全python36种设计模式。opp和oop的极致使用方式,一切编码思维逃不出这36计

    不要纠结是23种还是36种了,有细分的,举个例子 观察者模式和发布订阅模式,是有了少许变化,多了解一种总没啥坏处。 为什么是36种,因为是摘自菜鸟教程或者w3cschool网站,这两个网站都是36种,包含了j2ee模式,多...

    designpattern:Java设计模式

    设计模式分为4种类型:创建型,结构型,行为型和J2EE 创作模式 结构模式 行为模式 责任链 命令 口译员 迭代器 调解员 纪念 观察者 状态 空对象 战略 模板 威斯特 J2EE模式 商务代表 复合实体 道 前置控制器 拦截...

    asp.net知识库

    我对J2EE和.NET的一点理解 难分难舍的DSO(一) InternalsVisibleToAttribute,友元程序集访问属性 Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集...

    CS309-Object-Oriented-Programming:SUSTech课程CS309 OOP的个人回购

    CS309面向对象的程序设计SUSTech课程CS309 OOP的个人回购实验室Lab01:UML Lab02:UML续Lab03:Android Lab04:HTML,CSS,JS Lab05:观察者设计模式Lab06:J2EE mvc(请参见MVCProject文件夹) Lab07:J2EE mvc(请...

    在线考试系统设计与开发(课程设计).doc

    但是据我多方的观察和研究,发现大多 数的在线考试系统都是采用基于页面的模式开发,每个页面中都包含了要用到的所有功 能逻辑,导致代码重复率高,结构不够清晰,维护升级起来也很费时间和人力。鉴于这 种情况,...

    java 面试题 总结

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    超级有影响力霸气的Java面试题大全文档

     Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常...

    编程新手真言......

    8.16 真正的观察者模式 185 8.17 真正的装饰模式 186 8.18 真正的单例模式 186 8.19 真正的迭代器模式 186 8.20 真正的工厂模式 187 8.21 真正的门面模式 187 8.22 真正的命令模式 188 8.23 真正的模板方法模式 188 ...

Global site tag (gtag.js) - Google Analytics