最近在学习设计模式,特将学习的内容自我总结下,希望能和大家分享,并得到指正。首先分享观察者模式。
一、定义。
定义了对象之间的一对多的依赖,当一个对象发生改变时,它的所有依赖者都会收到通知并自动更新。如果对观察者模式不是很清楚的朋友,估计初看这个定义可能收获的会比较模糊。其实用通俗的话来说的话,其实就是表示一个一对多的结构。其中一代表一个主题,是产生消息的;而多则是需要接受消息,就是观察者了。书上举了一个很简单的例子,由气象局来代表主题,由它来产生气象信息,而这个气象消息可能需要不同的方式去展示,则每一种展示气象消息的媒介则就是每一个依赖于气象局的观察者了,因为要获取最新消息只能找气象局。
二、观察者的实现。
书中是先讲主题的,但是我觉得观察者更简单一些,所有还是先说一下观察者。这里是通过一个接口来定义的。
public interface Observer {
void update(Subject subject,Object obj);
}
比较简单,只有一个update方法,其中有两个参数,其中的subject是其所依赖的主题,而obj则是主题更新时传递过来的消息。每次发现有更新后会自动执行观察者的update方法将信息传递过来。
三、主题的实现。
同样也是通过接口定义,毕竟能面向接口编程,就少用继承。
public interface Subject {
/**
* 注册一个观察者
* @param observer
*/
void addObserver(Observer observer);
/**
* 删除一个观察者
* @param observer
*/
void removeObserver(Observer observer);
/**
* 发起通知观察者的动作
*/
void notifyObserver();
}
也是较为简单,其中也就最基本的三个方法。下面看一下具体实现吧。
public class SubJectTest implements Subject {
private boolean change;
private List<Observer> observerList;
private Object paramObject;
public SubJectTest(){
this.observerList=new ArrayList<Observer>();
}
public void addObserver(Observer observer) {
int i=this.observerList.indexOf(observer);
if(i<0){
this.observerList.add(observer);
}else{
System.out.println("is exist");
}
}
public void notifyObserver() {
if(change){
for (Observer ob:observerList) {
ob.update(this,paramObject);
}
this.makeChange(false);
}
}
public void removeObserver(Observer observer) {
int i=this.observerList.indexOf(observer);
if(i!=-1){
this.observerList.remove(observer);
}else{
System.out.println("is not exist");
}
}
public void makeChange(boolean change){
this.change=change;
}
public void updateInfo(Object obj){
this.paramObject=obj;
this.notifyObserver();
}
}
1、使用一个ArryList来存放注册的观察者。在构造方法中进行初始化。
2、其中还定义了一个change变量,在通知其所有的观察者前会先判断这个变量。其存在的意义时,也许主题并不是每一次改变都需要进行通知观察者,可以自己灵活控制。比如说,气象局对天气信息可能每1分钟就能更新一次,但是真正需要显示时的也许每天只需要通知一次而已。
3、updateInfo就是气象局自己更新了obj时,直接调用就好了,当change满足条件时,则会自动通知其依赖的所有的观察者。
4、makeChange则是你自己认为需要通知观察者时,改变其状态好了。
其结构也是相对较为简单的。那么下面实现两个简单的观察者好了,用来接收气象信息。
四、观察者的实现。
1、电视方式展示气象信息。
/*
* 电视方式展示气象信息
*/
public class CCTVObserver implements Observer {
public void update(Subject subject, Object obj) {
System.out.println("CCTV:"+obj);
}
}
2、短信方式展示气象信息。
/*
* 短信方式展示气象信息
*/
public class MessageObserver implements Observer {
public void update(Subject subject, Object obj) {
System.out.println("Message:"+obj);
}
}
五、测试。。
public class MainTest {
/**
* @param args
*/
public static void main(String[] args) {
/*
* 创建主题
*/
SubJectTest subject=new SubJectTest();
/*
* 创建观察者
*/
Observer cctv=new CCTVObserver();
Observer message=new MessageObserver();
/*
* 注册观察者
*/
subject.addObserver(cctv);
subject.addObserver(message);
//认为可以通知
subject.makeChange(true);
subject.updateInfo("成都地区,今天晴转多云,最高气温29度,最低气温15度,风力三级");
}
}
运行结果:
CCTV:成都地区,今天晴转多云,最高气温29度,最低气温15度,风力三级
Message:成都地区,今天晴转多云,最高气温29度,最低气温15度,风力三级
五、通过jdk自带API实现观察者模式。
jdk提供了java.util.Observable来定义主题,注意这个一个类,而不是接口。而提供java.util.Observer接口来定义接口,和我们自已定义的相同,只有一个update方法。
1、实现主题。
public class Subject extends java.util.Observable {
public void updateInfo(Object obj){
super.setChanged();
this.notifyObservers(obj);
}
}
可以看出,很简单了,注册呀删除呀事情,父类都帮你做了。你只要自己实现逻辑,需要通知时调用notifyObservers方法就好了。注意父类的makeChange是protected的,所有只有子类才能调用。
2、其他的实现和我们定义的就完全相同了,没有什么太大的改变。
/*
* 电视方式展示气象信息
*/
public class CCTVObserver implements java.util.Observer {
public void update(Observable o, Object arg) {
System.out.println("CCTV:"+arg);
}
}
/*
* 短信方式展示气象信息
*/
public class MessageObserver implements java.util.Observer {
public void update(Observable o, Object arg) {
System.out.println("Message:"+arg);
}
}
public static void main(String[] args) {
/*
* 创建主题
*/
Subject subject=new Subject();
/*
* 创建观察者
*/
Observer cctv=new CCTVObserver();
Observer message=new MessageObserver();
/*
* 注册观察者
*/
subject.addObserver(cctv);
subject.addObserver(message);
//认为可以通知
subject.updateInfo("成都地区,今天晴转多云,最高气温29度,最低气温15度,风力三级");
}
运行结果:
Message:成都地区,今天晴转多云,最高气温29度,最低气温15度,风力三级
CCTV:成都地区,今天晴转多云,最高气温29度,最低气温15度,风力三级
但是这样看,貌似使用jdk自带的观察者要简单一些。
六、jdk观察者的一些问题。
1、首先Observable不是接口。这个比较郁闷,毕竟继承了它就不能集成其他类了。
2、仔细的朋友可以看出两次运行结果的顺序不同。Observable注册的顺序和通知的顺序不同。从这点看出,灵活性不强。
附件为具体的代码。。
分享到:
相关推荐
HeadFirst的设计模式系列书籍以其直观易懂的方式深受程序员喜爱,本笔记将深入探讨观察者模式的概念及其应用。 观察者模式的核心思想是定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的...
行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...
行为型模式专注于类或对象间的交互和职责分配,如模板方法、命令、解释器、责任链、访问者、中介者、备忘录、观察者、状态和策略模式,它们定义了对象如何协作和执行任务。 状态机模式,也称为状态对象模式,是一种...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。
031114_【第11章:Java常用类库】_观察者设计模式笔记
本文主要关注的是Java编程语言中的设计模式,结合“Java与模式-笔记二”的博客内容,我们将深入探讨其中的一些核心设计模式及其在实际开发中的应用。 首先,我们来谈谈单例模式(Singleton)。单例模式确保一个类...
以及行为型中的策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。 设计模式的实施遵循六项核心原则: 1. **开闭原则**:软件...
《新版设计模式手册》中的笔记通过21个设计模式的概念图,直观地展示了这些模式的结构和交互方式,帮助读者形成清晰的认识。同时,生活类比将复杂的编程概念与日常经验相结合,使学习更加生动有趣。例如,单例模式...
在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...
这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心概念,旨在帮助开发者理解和应用这些模式。 一、设计模式的基本概念 设计模式是对在特定情境下软件设计问题的解决方案的一种描述...
设计模式Golang实现《研磨设计模式》读书笔记Go语言设计模式Go语言设计模式的实例代码创建模式工厂简单模式(Simple Factory)工厂方法模式(工厂方法)抽象工厂模式(Abstract Factory)创建者模式(Builder)原型...
在《深入浅出设计模式》的学习笔记中,我们可以看到几种关键的设计模式及其应用,包括策略模式、观察者模式、装饰者模式、工厂模式和抽象工厂模式。 1. **策略模式**: - 策略模式的核心在于将算法族封装在独立的...
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...
### 设计模式学习笔记 #### 一、设计模式概述 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。设计...
- **观察者模式**(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - **状态模式**(State):允许一个对象在其内部状态改变时改变它的...
在阅读完设计模式的书籍后,通过笔记进行总结和比较,有助于巩固理解,例如比较工厂模式与抽象工厂模式的区别,或者分析不同模式在特定场景下的优劣。 总之,“设计模式的读书总结笔记”是一份宝贵的资源,它可以...
3. **观察者模式**:行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在事件驱动编程中,如GUI组件间的交互,广泛使用此模式。 4. **...