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,然后写写程序。
分享到:
相关推荐
"最新的购物思想、最新的购物理念、最新的市场便捷"这部分描述可能指的是J2EE设计模式在电子商务领域的创新应用,如微服务架构、前后端分离、容器化部署等现代技术趋势。代码开放意味着源代码可供学习和改进,这对于...
首先,我们来探讨J2EE设计模式的演变和在软件工程中的地位。模式的概念最早可以追溯到建筑学,后来逐渐被应用到软件工程中,成为了一种被广泛认可的最佳实践。设计模式是解决特定设计问题的通用模板,可以帮助开发者...
Java和J2EE设计模式尤其在大型企业级应用开发中扮演着关键角色,它们提供了可复用、可维护和可扩展的解决方案。以下是23种Java设计模式和15种J2EE设计模式的概述: **Java设计模式** 1. **单例模式**:确保一个类...
**J2EE设计模式API** 是一套用于构建可扩展、高效和可维护的企业级Java应用程序的框架和最佳实践。设计模式是软件开发中经过验证的解决方案模板,可以在特定上下文中解决常见问题。J2EE(Java Platform, Enterprise ...
在深入探讨《23种Java设计模式和15种J2EE设计模式》这一主题之前,我们首先需要明确设计模式的概念及其在软件工程中的重要性。设计模式是一种在特定情境下解决问题的模板,它描述了在软件设计中遇到的问题以及解决...
《实用J2EE设计模式编程指南》是一本深入讲解如何在Java企业级环境中应用设计模式的书籍。在Java EE(以前称为J2EE)平台上,设计模式是开发可扩展、可维护和高效软件的关键工具。以下是一些核心知识点的详细说明: ...
通过这份"J2EE设计模式与Structs详解"资料,读者可以深入理解如何在实际项目中运用这些设计模式,以及如何借助Structs框架提升开发效率。精通Struts技术文档则结合实践经验,为开发者提供了宝贵的项目开发指导,包括...
Java设计模式是软件开发中的重要概念,特别是在J2EE企业级应用开发中,它们提供了一套标准的方法来解决常见的设计问题,提高了代码的可重用性、可维护性和可扩展性。以下是关于J23种Java设计模式的一些关键知识点: ...
### Java常用设计模式详解 #### 一、设计模式概述 设计模式是一种在特定情况下解决软件设计问题的经验总结,它能够帮助开发者在面对相似的问题时快速找到解决方案。设计模式大致可以分为三大类:创建型模式、结构...
- **观察者模式**:在事件驱动的系统中,如JMS(Java Message Service)中的发布/订阅模型。 - **模板方法模式**:在父类定义一个操作的骨架,子类可以具体实现某些步骤,如J2EE的生命周期回调方法。 - **适配器...
J2EE设计模式是针对J2EE平台中特定问题而设计的一系列模式。它们被分类为表示层模式、业务层模式和集成层模式。表示层模式如MVC(模型-视图-控制器)模式,用于将数据和业务逻辑分离,使视图部分和用户交互;业务层...
j2ee 观察者模式 附ppt 在日常生活中,常常会用这样的情形:当某件事发生时,应该通知所有的相关者。例如,如果我们的课程改变时间或地点,就应该通知所有选修了这门课程的同学。 在软件设计中,也有类似的问题:当...
以上仅是J2EE设计模式中的一部分,实际应用中还有更多模式如观察者(Observer)、访问者(Visitor)、建造者(Builder)等。通过合理运用设计模式,开发者能够构建出高效、可扩展且易于维护的J2EE应用。《实用J2EE...