基于观察者模式的系统设计与实现
- 格式:doc
- 大小:108.00 KB
- 文档页数:11
信号和槽的底层原理信号和槽是Qt框架中一种用于实现对象间通信的机制。
它是一种基于观察者模式的设计模式,用于在不同对象之间传递信息和触发相应的操作。
在Qt中,信号是一种特殊的函数,用于通知其他对象发生了某个特定的事件。
信号可以在任何时候被发射,且可以带有参数。
槽是一种普通的成员函数,用于接收信号并执行相应的操作。
当信号被发射时,与之相连接的槽函数会被自动调用。
底层原理上,信号和槽的实现依赖于Qt的元对象系统(Meta-Object System)。
Qt通过在编译时为每个包含信号和槽的类生成额外的元对象代码,实现了信号和槽的自动连接和调用。
这些额外的代码主要包括元对象的描述信息和信号槽的映射关系。
在运行时,Qt通过元对象系统中的元对象来管理信号和槽的连接。
每个类都有一个对应的元对象,其中包含了类的属性、方法和信号槽等信息。
当一个对象被创建时,会自动为其关联一个元对象。
通过元对象,Qt可以在运行时获取到类的详细信息,并根据信号槽的映射关系来进行信号的发送和槽的调用。
具体而言,当一个信号被发射时,Qt会根据信号的名称和参数类型在元对象中查找对应的槽函数。
如果找到了匹配的槽函数,则会将信号的参数传递给槽函数,并执行相应的操作。
如果一个信号有多个槽函数与之相连接,那么所有的槽函数都会被依次调用。
为了实现信号和槽的连接,Qt提供了多种方式。
最常用的方式是使用connect函数将信号与槽函数进行绑定。
connect函数接受两个参数,第一个参数是信号的发送者,第二个参数是槽函数的接收者。
通过connect函数,可以将一个信号连接到一个或多个槽函数上,实现对象间的通信。
除了使用connect函数外,Qt还提供了一些其他的连接方式,如使用信号和槽的宏和关键字。
这些方式都是为了方便开发者使用信号和槽机制,提高代码的可读性和可维护性。
总结起来,信号和槽是Qt框架中一种实现对象间通信的机制,其底层原理基于Qt的元对象系统。
设计模式在实际项目中的应用当我们设计并开发项目时,我们通常会使用设计模式来解决特定的问题。
设计模式是可重用的软件解决方案,用于解决在软件开发过程中常见的问题。
它是经过许多实际项目验证的最佳实践,对于保证代码质量、提高项目可维护性和可拓展性都有很重要的作用。
在本文中,我将阐述设计模式在实际项目中的应用。
一、单例模式(Singleton Pattern)在一个系统中,可能有些类只需要一个实例。
例如,我们经常使用的数据库连接池、日志处理、线程池等类,只能存在一个实例,否则会导致资源的浪费。
这种情况下,我们可以使用单例模式。
当我们使用单例模式时,我们需要确保这个类只有一个实例存在。
我们可以在类中定义一个静态变量,这个静态变量中存储着自身的唯一实例。
我们还需要将构造函数设置为私有,以防止外部的类创建新的实例。
在需要使用这个实例的时候,我们可以通过调用类中的静态方法来获取此实例。
举个例子,当我们需要使用数据库连接池连接数据库的时候,可以使用单例模式来处理。
我们在程序启动的时候创建一个数据库连接池的实例,之后每次使用连接池时都可以调用这个实例进行连接,避免了每次都需要创建一个新的连接池的麻烦和资源的浪费。
二、工厂模式(Factory Pattern)工厂模式是我们在实际项目中经常使用到的一个设计模式。
工厂模式主要用于创建对象。
在我们需要创建大量相似的对象时,通过工厂模式可以将对象的创建过程封装起来,使我们避免在代码中频繁地进行对象的创建。
工厂模式主要由工厂类和产品类组成。
在工厂类中,我们定义一个方法来生产需要的对象。
在产品类中,我们定义具体的实现方式。
使用工厂模式可以将对象的实现和对象的使用分开,可以提高代码的健壮性和可维护性。
三、观察者模式(Observer Pattern)观察者模式是面向对象设计中非常有用的一种模式。
它用于对象间的消息传递,通常用于处理系统的事件处理。
在系统中,当一个对象的状态发生改变时,它会自动通知其它观察者,以便观察者可以对变化做出相应的处理。
第1篇一、实验背景随着软件工程的不断发展,设计模式作为一种解决软件开发中常见问题的有效方法,越来越受到广泛关注。
本次实验旨在通过学习设计模式,提高编程能力,掌握解决实际问题的方法,并加深对设计模式的理解。
二、实验目的1. 理解设计模式的基本概念和分类;2. 掌握常见设计模式的原理和应用;3. 提高编程能力,学会运用设计模式解决实际问题;4. 培养团队协作精神,提高项目开发效率。
三、实验内容本次实验主要涉及以下设计模式:1. 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式;2. 结构型模式:适配器模式、装饰者模式、桥接模式、组合模式、外观模式;3. 行为型模式:策略模式、模板方法模式、观察者模式、责任链模式、命令模式。
四、实验过程1. 阅读相关资料,了解设计模式的基本概念和分类;2. 分析每种设计模式的原理和应用场景;3. 编写代码实现常见设计模式,并进行分析比较;4. 将设计模式应用于实际项目中,解决实际问题;5. 总结实验经验,撰写实验报告。
五、实验结果与分析1. 创建型模式(1)单例模式:通过控制对象的实例化,确保一个类只有一个实例,并提供一个访问它的全局访问点。
实验中,我们实现了单例模式,成功避免了资源浪费和同步问题。
(2)工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
实验中,我们使用工厂模式创建不同类型的交通工具,提高了代码的可扩展性和可维护性。
(3)抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
实验中,我们使用抽象工厂模式创建不同类型的计算机,实现了代码的复用和扩展。
(4)建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实验中,我们使用建造者模式构建不同配置的房屋,提高了代码的可读性和可维护性。
2. 结构型模式(1)适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作。
观察者模式的应用场景观察者模式是一种设计模式,用于实现对象之间的一对多依赖关系。
在该模式中,一个对象(subject)维护了一个观察者列表,当subject的状态发生变化时,它会自动通知所有观察者,使它们能够做出相应的响应。
观察者模式可以帮助我们实现松耦合的设计,提高代码的复用性和可维护性。
下面我们将介绍观察者模式的几个常见应用场景。
一、图形界面组件观察者模式在图形用户界面(GUI)的设计中被广泛应用。
例如,在一个窗口中,可以有多个按钮,当按钮被点击时,窗口会触发相应的事件。
这些按钮就是观察者,窗口是被观察者。
当按钮被点击时,窗口会通知所有的按钮,并且每个按钮都可以根据需要进行响应,例如执行一段特定的代码。
通过观察者模式,可以实现图形界面组件之间的解耦,使得它们可以独立地进行开发和维护。
二、消息订阅与发布观察者模式也可以用于消息订阅与发布的场景。
在这种场景下,可以有多个消息的订阅者(观察者),当有新的消息发布时,订阅者会收到通知并进行相应的处理。
这种模式可以应用于各种场景,例如新闻订阅、实时数据监控等。
通过观察者模式,发布者和订阅者之间的耦合度得到了降低,方便了系统的扩展和维护。
三、事件处理在事件驱动的程序设计中,观察者模式也经常被用于事件的处理。
事件可以是用户的操作,例如鼠标点击、键盘输入等,也可以是系统的通知,例如网络连接成功、文件加载完成等。
当事件发生时,被观察者会通知所有的观察者,并且每个观察者可以根据自身的需要做出相应的处理。
这种模式使得事件的处理变得灵活而可扩展,方便了程序的开发和维护。
四、数据监控与同步观察者模式还可以用于数据监控与同步的场景。
例如,在一个分布式系统中,可以有多个节点,每个节点都有自己的状态。
当任何一个节点的状态发生变化时,需要通知其他的节点进行同步。
这时,可以使用观察者模式,将每个节点作为观察者,当任何一个节点的状态发生变化时,它会通知其他的节点进行相应的更新操作。
【精品实验报告】软件体系结构设计模式实验报告软件体系结构设计模式实验报告学生姓名: 所在学院: 学生学号: 学生班级: 指导老师: 完成日期:一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括组合模式、外观模式、代理模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现组合模式、外观模式、代理模式、观察者模式和策略模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。
(1) 组合模式使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
绘制类图并编程模拟实现。
(2) 组合模式某教育机构组织结构如下图所示:北京总部教务办公室湖南分校行政办公室教务办公室长沙教学点湘潭教学点行政办公室教务办公室行政办公室教务办公室行政办公室在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
(注:可以定义一个办公室类为抽象叶子构件类,再将教务办公室和行政办公室作为其子类;可以定义一个教学机构类为抽象容器构件类,将总部、分校和教学点作为其子类。
)(3) 外观模式某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。
读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。
现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块,要求编程模拟实现。
系统设计常见的设计模式及其实际应用案例在软件开发领域,设计模式是一组被广泛应用于解决常见问题的可重复利用的解决方案。
设计模式可以提高代码的可读性、可维护性和可扩展性,使系统更加灵活和可靠。
本文将介绍一些常见的系统设计模式,并提供相应的实际应用案例。
一、单例模式单例模式是一种创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。
单例模式常被用于数据库连接、日志记录器等资源共享的场景。
实际应用案例:Java中的Runtime类就是一个典型的单例模式。
通过调用`Runtime.getRuntime()`方法,可以获取到全局唯一的Runtime实例,从而实现对系统运行时环境的访问。
二、工厂模式工厂模式是一种创建型模式,它定义了一个用于创建对象的接口,但具体的对象创建逻辑由具体的工厂类来实现。
工厂模式能够将对象的创建与使用分离,降低了耦合性。
实际应用案例:在Java中,Calendar类就是通过工厂模式来创建日期对象的。
通过调用`Calendar.getInstance()`方法,可以根据当前系统的时区和语言环境,返回一个具体实现的Calendar对象。
三、观察者模式观察者模式是一种行为型模式,它定义了一种一对多的依赖关系,使得当一个对象状态发生变化时,其依赖对象能够自动收到通知并进行相应的更新。
实际应用案例:Android中的广播机制就是观察者模式的实际应用。
当一个广播消息被发送时,所有注册了相应广播接收器的组件都能够接收到并做出响应。
四、策略模式策略模式是一种行为型模式,它定义了一系列可相互替换的算法,并将每个算法封装在独立的类中。
通过切换不同的策略对象,可以在运行时改变系统的行为。
实际应用案例:在电商系统中,用户下单时可以选择不同的支付方式,比如支付宝、微信、银行卡等。
这些不同的支付方式就可以使用策略模式来实现。
五、装饰者模式装饰者模式是一种结构型模式,它允许动态地为对象添加额外的功能,同时又不改变其原有的结构。
软件工程师中的常见设计模式设计模式是软件开发中经验丰富的工程师在解决特定问题时总结出的一种模式或思想,它可以提供一套解决方案,帮助开发人员降低系统的复杂性,并增加代码的可读性和可维护性。
在软件工程师的日常开发过程中,熟悉和掌握常见的设计模式是非常重要的。
本文将介绍一些常见的设计模式,以帮助软件工程师更好地应用设计模式。
一、单例模式单例模式是一种创建型的设计模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。
在软件开发中,我们常常需要保证某个类的实例只有一个,比如数据库连接池、线程池等。
使用单例模式可以有效地避免资源的浪费和冲突。
单例模式的实现方式有多种,其中最常见的是饿汉式和懒汉式。
饿汉式是在类加载时就创建实例,而懒汉式是在首次使用时才创建实例。
二、工厂模式工厂模式是一种创建型的设计模式,它的主要目的是将具体对象的创建和客户端的使用相分离。
工厂模式通过一个工厂类来负责创建对象,客户端只需要调用工厂类的方法即可获取所需的对象,而不需要关心具体对象的创建过程。
工厂模式有三种常见的实现方式:简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式通过一个工厂类来创建所有的对象,工厂方法模式通过一个工厂接口和多个具体工厂类来创建对象,抽象工厂模式通过多个工厂接口和多个具体工厂类来创建对象。
三、观察者模式观察者模式是一种行为型的设计模式,它的主要目的是定义了对象之间的一对多依赖关系,使得当一个对象状态发生改变时,其他依赖于它的对象都会收到通知并自动更新。
观察者模式由两个核心角色组成:观察者和被观察者。
其中被观察者维护着一个观察者列表,并提供注册和注销观察者的方法,而观察者通过接收被观察者的通知并执行相应的操作。
四、策略模式策略模式是一种行为型的设计模式,它的主要目的是定义了一系列的算法,并将其封装成独立的对象,使得这些算法可以互相替换。
通过使用策略模式,可以使得算法和客户端解耦,客户端无需关心具体的算法实现细节。
解读设计模式及其在实际项目中的应用设计模式是软件开发中的一种经验总结,是前辈们在解决软件设计和开发过程中遇到的一些常见问题,总结出来的最佳实践。
设计模式提供了一种在特定情境下解决问题的经典方式,能够帮助开发者以一种可重用、可维护、可扩展的方式构建软件系统。
在软件开发过程中应用设计模式,能够提高开发效率、降低与他人合作的成本、提高软件质量、减少重复代码的出现,并且使得软件结构更加清晰易读。
下面我们来详细解读一些常见的设计模式以及它们在实际项目中的应用。
1. 单例模式(Singleton Pattern)单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。
在实际项目中,单例模式常常被用来管理共享资源、日志记录器、数据库连接等。
例如,在一个多线程的应用程序中,我们可以使用单例模式确保只有一个线程在访问共享资源,从而避免资源的竞争。
2. 工厂模式(Factory Pattern)工厂模式是一种创建型设计模式,用于通过一个工厂类创建对象,而无需显式指定具体的类。
工厂模式可提供一种灵活性,使得程序能够适应修改而无需修改大量的代码。
在实际项目中,工厂模式常用于封装对象的创建过程,并通过一个通用的接口来返回具体的实例。
3. 观察者模式(Observer Pattern)观察者模式是一种行为型设计模式,其中一个对象(称为主题)维护一系列依赖于它的对象(称为观察者),并在状态发生改变时自动通知这些观察者。
观察者模式能够实现松耦合,提高代码的可重用性和可扩展性。
在实际项目中,观察者模式被广泛应用于事件处理、消息队列、组件间的通信等场景。
4. 适配器模式(Adapter Pattern)适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端期望的接口。
适配器模式能够解决两个不兼容接口之间的兼容问题,使得它们能够一起工作。
在实际项目中,适配器模式常用于集成第三方库、系统间的接口适配、旧系统升级等场景。
基于观察者模式的系统设计与实现【摘要】:本论文的论述中心是要对观察者模式进行研究和分析,我主要是首先通过对观察者模式简介和概述,一定程度上了解观察者模式,再者,对观察者模式结构的分析与使用方法以及通过研究观察者优缺点,深入对整一个观察者模式进行透彻的分析。
通过各种实例,一一地对其仔细的运用。
【关键字】:观察者模式主题 Observable类观察者接口调用【正文】:1.1观察者模式的基本简介:1.1.1 观察者模式观察者模式(有时又被称为发布/订阅模式)是软体设计模式的一种。
在这种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。
这通常透过呼叫各个观察者所提供的方法来实现。
此种模式通常被用来实作事件处理系统。
同时观察者模式(Observer)完美的将观察者和被观察的对象分离开。
举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。
面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。
一个对象只做一件事情,并且将他做好。
观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
1.1.2 实现方式观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。
在刚才的例子中,业务数据是被观察对象,用户界面是观察者。
观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。
如果在用户界面、业务数据之间使用这样的观察过程,可以确保界面和数据之间划清界限,假定应用程序的需求发生变化,需要修改界面的表现,只需要重新构建一个用户界面,业务数据不需要发生变化。
实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。
无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。
1.2 “主题”与“观察者”在许多设计中,经常设计多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化。
例如,某些寻找工作的人对“求职中心”的职业需要的变化非常关心,很想跟踪“求职中心”中职业需要信息的变化。
一位想知道“求职中心”职业需求信息变化的人需要成为求职中心的“求职者”,即让求职中心把自己登记到求职中心列表中,当一个人成为求职中心后的求职者之后,求职中心就会及时通知他最新的职业需求信息。
如果一个求职者不想继续知道求职中心的职业需求信息,就让求职中心把自己从求职中心的求职者列表中删除,求职中心就不会再通知他职业需求信息。
观察者模式是关于多个对象想知道一个对象中数据变化情况的一种成熟的模式。
观察者模式中有一个称作“主题”的对象和若干个称作“观察者”的对象,“主题”和“观察者”间是一种一对多的依赖关系,当“主题”的状态发生变化时,所有“观察者”都得到通知。
前面所述的“求职中心”相当于观察者模式的一个具体“主题”;每一个“求职者”相当于观察者模式中的一个具体“观察者”。
1.3模式的结构与使用观察者模式的结构中包括四种角色。
•主题(subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如,添加、删除观察者以及通知观察者更新数据的方法。
•观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。
•具体主题(ConcreteSubject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。
具体主题需使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时通知具体观察着。
•具体观察者(ConcreteObserver):具体观察者是实现观察者接口类得一个实例。
具体观察者包含有可以存放具体主题引用的主题接口变量,以便具体观察者让具体主题将自己的引用添加到具体主题的集合中,使自己成为它的观察者,或让这个具体主题将自己从具体主题的集合中删除,使自己不再是它的观察者。
1.3.1 结构的描述下面通过一个简单的问题来描述观察者模式中所涉及的各个角色,这个简单的问题是:有一个大学毕业和一个归国留学着都希望能及时知道“求职中心”最新的职业需求信息。
1.主题本问题中,主题接口Subject规定的了具体主题需要实现的添加、删除观察者以及通知观察者更新数据的方法。
Subject接口的代码如下:Subject.javaPublic interface Subject{Public void addObserver(Observer o);Public void deleteObserver(Observer o);}2.观察者观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。
对于本问题,观察者接口规定的方法是;hearTelephone()(相当于观察者模式类图中的update()方法),即要求具体观察者都通知实现hearTelephone()方法(模拟接听电话)来更新数据。
Observer接口的代码如下:Observer.javaPublic interface Observer{Public void hearTelephone(String hearMess);}3.具体主题主题接口规定了具体主题需要实现的通知观察者更新数据的notifyObservers()方法,具体主题通过实现notifyObserver()方法来通过具体观察者,实现的方式是遍历具体主题中用来存放观察者引用的集合,并让集合中的每个具体观察者接口(Observer)规定更新数据的方法,比如heaeTelephone()方法。
对于某种问题,集体主题应当保证数据确实发生了变化再遍历存放观察者应用的集合。
在本问题中,具体主题维护着一个String字符串,用来表示“求职中心”的职业需求信息,当该String字符串发生变化时,具体主题遍历存放观察者引用的集合。
创建具体主题的类是SeekJobCenter,代码如下:SeekJobCenter.javaimport java.util.ArrayList;Public class SeekJobCenter implements Subject{String mess;Boolean changed;ArrayList<Observer> personList;SeekJobCenter(){personList = new ArrayList<Observer>();mess = “ ”;changed = new false;}Public void addObserver(Observer o){if(!(personList.contains(o)))personList.add(o);}Public void deleteObserver(Observer o){if(personList.contains(o))personList.remove(o);}{if(changed){For(int i = 0 ;i<personList.size();i++){Observer observer = personList.get(i);Observer.hearTelephone(mess);}changed = false;}}Public void giveNewMess(String str){if(str.equals(mess))changed = false;else{mess = str;changed = true;}}}3.具体观察者本问题中,实现观察者接口Observer的类有两个:一个是UniversityStudent类,另一个是HaiGui。
UniversityStude类的实例调用hearTelephone(String heardMess)方法时,会将参数引用的字符串保存到一个文件中。
HaiGui类的实例调用hearTelephone(String heardMess)方法时,如果参数引用的字符串中包含有“程序员”或“软件”,就将信息保存到一个文件中。
UniversityStudent和HaiGui类的代码如下:UniversityStudent.javaimport java.io.*;public class UniversityStudent implements Observer observer{Subject subject;File myFile;UniversityStudent(Subject subject,String flieName){this.subject = subject;subject.addObserver(this);myFile = new File(fileName);}public void hearTelephone(String heardMess){Try{RandomAccessFile out = new RandomAccessFile(myFile,”rw”);out.seek(out.length());byte [] b = heardMess.getBytes();out.write(b);System.out.print(“我是一个大学生,”);System.out.println(“我向文件”+ myFile.getName() + “写入如下内容:”);System.out.println(heardMess);}catch(IOException exp){System.out.println(exp.toString());}}}HaiGui.javaimport java.io.*;import java.util.regex.*;public class HaiGui implements Observer{Subject subject;File myFile;HaiGui(Subject subject,String fileName){this.subject = subject;subject.addObserver(this);myFile =new File(fileName);}public void hearTelephone(String heardMess){Try{boolean boo = heardMess.contains(“ja va 程序员”)||heardMess.contains(“软件”);if(boo){RandomAccessFile out = new RandomAccessFile(myFile,”rw”);out.seek(out.length());byte [] b = heardMess.getBytes();out.write(b);System.out.print(“我是一个海归,”);System.out.println(“我向文件”+ myFile.getName()+”写入如下内容:”);System.out.println(heardMess);}else{System.out.println(“我是海归,这次的信息中没有我需要的信息”);}}catch(IOException exp){System.out.println(exp.toString());}}}1.3.3 模式的使用前面已经使用观察者模式给出了可以使用的类,这些类就是一个小框架,可以使用这个小框架中的类编写应用程序。