设计模式之observer

面向对象的开发的一个主导原则是,在给定的应用程序中正确地划分任务。系统中的每个对象应该将重点放在问题域中的离散抽象上。简而言之,一个对象只应做一件事,而且要将它做好。这种方法可确保在对象之间划定清晰的界限,因而可提供更高的重用性和系统可维护性。

  一个特别重要的领域是用户界面和基础业务逻辑之间的交互。在应用程序的开发过程中,需要快速更改用户界面,并且不能对应用程序的其他部分产生连带影响,这是司空见惯的事。此外,业务要求也可能会发生变化,而这一切与用户界面无关。具有丰富开发经验的人都知道,在很多情况下,这两组要求都会发生变化。如果没有划分UI和应用程序其他部分,修改任一部分都会对整体造成不利的影响。

  很多应用程序都需要在用户界面和业务逻辑之间划分清晰的界限。因此,自GUI出现以后,很多面向对象的框架均支持将用户界面从应用程序的其他部分中划分出来。其中的大部分应用程序采用的设计模式几乎相同。这种模式通常称为观察者,它非常有助于在系统中各种对象之间划分清晰的界限。此外,还会经常看到在框架或应用程序中与UI无关的部分中使用这种解决方案。Observer模式的作用远远超过了其最初的想法。

虽然Observer模式有很多变体,但该模式的基本前提包含两个角色:观察者(observer)和主体(subject)(熟悉Smalltalk MVC的人将这些术语分别称为View和Model)。在用户界面的环境中,观察者是负责向用户显示数据的对象。另一方面,主体表示从问题域中模拟的业务抽象。正如图1中所描述的一样,在观察者和主体之间存在逻辑关联。当主体对象中发生更改时,(例如,修改实例变量),观察者就会观察这种更改,并相应地更新其显示。

例如,假定我们要开发一种简单的应用程序,来跟踪全天的股票价格。在此应用程序中,我们指定一个Stock类来模拟在NASDAQ交易的各种股票。该类包含一个实例变量,它表示在全天不同时段经常波动的股价。为了向用户显示此信息,应用程序使用一个StockDisplay类向stdout(标准输出)写信息。在此应用程序中,一个Stock类实例作为主体,一个StockDisplay类实例作为观察者。随着股价在交易日中随时间发生变化,Stock实例的当前股价也会发生变化(它怎样变化并不重要)。因为StockDisplay实例正在观察Stock实例,所以在这些状态发生变化(修改股价)时,就会向用户显示这些变化。

  通过使用这种观察过程,可以在Stock和StockDisplay类之间划分界限。假定应用程序的要求第二天发生变化,要使用基于窗体的用户界面。要启用此新功能,只需要构造一个新类StockForm作为观察者。无论发生什么情况,Stock类都不需要进行任何修改。事实上,它甚至不知道发生此类更改。类似地,如果需求变化要求Stock类从另一个来源检索股价信息(可能是从Web服务,而不是从数据库中检索),则StockDisplay类不需要进行修改。它只是继续观察Stock就够了。

接下来,结合个人的学习方式:给个特定的例子,该例子简单模拟了awt事件处理

interface MyActionListener{
//监听器接口,定义一个处理事件的统一入口,从概念上来说,就是观察者了
public void actionPerformed(MyActionEvent e);

}
接下来定义MyActionEvent类,表示事件类型以及相关的事件信息

class MyActionEvent{
protected Object source;//产生事件的源对象

long when;//产生事件的事件

public MyActionEvent(Object source){
//源对象在产生事件时,调用此构造方法
this.source = source;
}

public long getWhen(){
return when;
}

public Object getSource(){
return source;
}
}

接着我们定义一个鼠标事件MyMouseEvent,继承MyActionEvent类

class MyMouseEvent extends MyActionEvent{

public MyMouseEvent(Object source) {//继承父类的构造方法
super(source);
}
public MyMouseEvent(Object source,long when){
//创建一个带事件时间的构造方法,此方法也由事件源调用
this(source);
this.when = when;
}

}

有了这些,我们现在来创建被观察者,也就是事件源MyButton类

class MyButton{
List<MyActionListener> actionListeners = new ArrayList<MyActionListener>();//所注册的所有观察者
public void addActionListener(MyActionListener actionListener){//增加观察者
actionListeners.add(actionListener);
}
public void pressedButton(){//事件发生
MyMouseEvent e = new MyMouseEvent(this,System.currentTimeMillis());//创建一个相应的事件对象
for(MyActionListener listener:actionListeners){
listener.actionPerformed(e);//交由观察者处理
}
}
}

基本上有了这些,我们再来写一个简单的测试

public class Test {
public static void main(String[] args){
MyButton b = new MyButton();//创建事件源
b.addActionListener(new MyActionListener(){
public void actionPerformed(MyActionEvent e) {
System.out.println("button pressed");
}
});//这里使用了内部匿名类构造观察者,并注册给事件源
b.pressedButton();//事件发生
}

}

看到这里,大家是否有种似曾相识的感觉呀?没错了,这和我们在awt里常用的组件事件处理方式是一样的。原来awt用的也是observer呀。

先到此告一段落了,今天写了太多,上班都没怎么做事。。。汗一个
python实现带符号的二进制数转换十进制数 (附完整源码) 阅读详情

相关推荐

C#中使用OpenCV的常用函数

c# opencv 常见操作

大黄鸭在发光的专栏 1078

Observer设计模式

Observer模式 一、Observer设计模式初步描述 1.1 问题 Observer模式应该可以说是应用最多、影响最广的模式之一,因为Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦。个人也认为Observer模式是软件开发过程中必须要掌握和使用的模式之一。在MFC中,Do

勇敢无畏的活着 1225

Claude Code长期记忆:优雅的上下文管理

ClaudeCode的上下文管理系统采用三层架构设计,通过智能压缩和优化策略在记忆容量与性能间取得平衡。系统包含短期记忆(高速工作区)、中期记忆(智能蒸馏器)和长期记忆(持久化知识库)。当Token使用率达到92%阈值时启动wU2压缩器,采用8段式结构化摘要保留关键信息,并配合智能文件恢复和渐进式预警机制。该系统通过分层处理、优雅降级和透明化交互,为AI应用提供了高效可靠的上下文管理方案,展现了在有限资源下实现智能记忆的艺术。

m0_53117338的博客 3814

设计模式之Observer(转载)

设计模式之Observer板桥里人 http://www.jdon.com 2002/3/16模式实战书籍《Java实用系统开发指南》Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Observe

设计模式 Design patterns 840

中国30米分辨率城市建成区数据集 (1972-2023年)

全国城市建成区空间分布数据(1972-2023年),利用Google Earth Engine平台,基于Landsat系列遥感影像提取了1972–2023年城市不透水面,后经过不透水面聚集密度计算方法计算了不透水面聚集密度,通过阈值划分提取了城市建成区,并设置了建成区面积阈值,去除了噪点,获取了全国城市建成区空间分布数据集。该提取能准确刻画城市形态,提取精度高,保持了建成区的完整性。数据集包括41期数据,1972年,1978年,1985-2023年逐年,分辨率为30米,有栅格和矢量两种格式。

地球资源数据云的官方博客 5824

时钟门控ICG单元的timing问题

本文探讨了数字IC设计中门控时钟(ICG)的时序收敛问题,重点分析了ICG单元在setup时序检查中易出现违例的原因及优化方法。文章指出,由于ICG单元不在时钟树平衡范围内,其时钟路径延迟通常小于后续寄存器,导致setup时序难以满足。提出的解决方案包括:1)将ICG尽量靠近受控寄存器放置;2)使用set_clock_gating_check命令加强时序约束;3)在布局阶段设置负时钟延迟;4)CTS阶段设置插入延迟。同时强调set_clock_gating_check命令对ICG单元同样有效,并介绍了ICG

u011075954的专栏 1104

JDK Observer 设计模式之研究

    目前设计模式的介绍性文章越来越多,但设计模式的研究性文章仍然比较欠缺,这着实让人觉得有点遗憾。本文旨在抛砖引玉,具体分析一下java中jdk自带的observer设计模式(下文如没特别指出,observer设计模式就意指java中jdk自带的observer设计模式)的实现。1.       Observer 设计模式概要Observer设计模式在GOF里属于行为设计模式。JD

别岸 的专栏 1361

【Power Compiler手册】4.saif文件

功耗计算的准确性取决于切换活动数据的准确性。这些数据是通过使用RTL仿真或门级仿真生成的,并存储在SAIF文件中。在执行功耗优化和分析之前,应该使用SAIF文件来反标设计对象上的切换活动信息。SAIF是由Synopsys支持的ASCII格式,用于促进不同Synopsys工具之间的信息交换(参见IEEE 1801标准,附录J)。使用`read_saif`命令读取SAIF文件,使用`write_saif`命令写出SAIF文件。有关更多信息,请参见`read_saif`和`write_saif`命令的手册页。

QRBQ 2186

设计模式05 之Observer Event

设计模式04 之Strategy 1. “组件协作” 模式: 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 典型模式 Template Method(模板方法) Observer(观察者模式) / Event(事件模式) Strategy(策略模式) 2. Observer 观察者模式 1. 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个

ネロ・クラウディウス 272

LLaMA Factory添加新模型template的实战解析

本文主要介绍了LLaMA Factory添加新模型template的实战解析,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战解析 2.1 检查代码 2.2 修改代码

herosunly的博客 19万+

EndNote X9 参考文献附录列表 格式调整

EndNote X9 插入参考文献常见问题总结

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2568

在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统

电动汽车(EV, Electric Vehicle)的动力学建模与控制仿真在车辆开发过程中起着至关重要的作用。通过Simulink进行整车动力学模型的构建和控制策略的验证,可以有效评估车辆性能、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的电动汽车整车动力学模型与控制仿真。该系统能够模拟复杂的整车动力学行为,验证控制策略的有效性,并通过优化设计提高车辆的性能和可靠性。

xiaoheshang_123的博客 549

Java设计模式之Observer

Java设计模式之Observer 1.概念 observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。...

seaizon的专栏 156

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

设计模式---观察者模式(DesignPattern_Observer)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 162

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

[DesignPattern]Observer Pattern (Python)

周五听峰哥说java的设计模式,于是看看python的实现,理解下。 #!/usr/bin/env python # -*- coding: utf-8 -*- # observer_simple.py # Date: 2014-03-16 # CopyRight: orangleliu@gmail.com # Lisence: BSD # tips:简单实现观察者模式 class Sub

orangleliu 笔记本 1894

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

DesignPattern : Observer

1. Introduction     1. We can infer Observer Design Pattern from JDK GUI part.     2. The AWT and Swing GUI components are using Observer Design Pattern which we will discuss later.   2. A simpl...

Davyjones2010的博客 236

设计模式17——Observer设计模式

Observer观察者设计模式用于将对象的变化通知给感兴趣的用户。在Observer模式中的角色为主题(subject)与观察者(observer),观察者订阅它感兴趣的主题,一个主题可以被多个观 察者订阅,当主题的状态发生变化时,它必须通知(notify)所有订阅它的观察者,观察者检视主题的状态变化,并作出对应的动作,所以Observer模式也称之为Publish-Subscribe模式。 Ob

Tony Chen的专栏 1656

[Design Pattern] Observer Pattern 简单案例

Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式。 下面是一个观察者模式的简单案例。 Observer 定义观察者的接口,定义需要观察的对象,已经被通知的接口。BinaryObserver, OctalObserver, HexaObserver 各自实现了 Observer 接口。...

QQ562224896的博客 113

在Java中,什么叫观察者设计模式(observer design pattern)?

下面是一个简单的Java代码演示观察者设计模式,其中一个WeatherData类是被观察者,而两个观察者CurrentConditionsDisplay和StatisticsDisplay都实现了Observer接口,以便接收WeatherData对象的状态变化通知并作出相应的处理。在观察者设计模式中,有两种角色:观察者和被观察者。在观察者设计模式中,目标对象和观察者对象之间是松耦合的,目标对象并不直接调用观察者对象的方法,而是通过定义一些接口,使得目标对象和观察者对象能够协同工作。

Blue92120的博客 845

设计模式(八)【Observer模式】

Observer模式 《设计模式》分类 分类 意图 例子 用途 创建型 创建或实例化对象 Abstract FactorySingletonDouble-Checked LockingFactory Method 实例化对象 结构型 将已有的对象组合起来 FacadeAdapterBridge 处理接口将实现与抽象联系起来 行为型 给出一种提供灵活(变化)行为的方式 Str...

xiaowei_innocence的博客 523

设计模式之Observer——公交篇(原创)

设计模式之Observer——公交篇  说到公交车,我想大家都不陌生吧,坐过公交车的朋友可能都知道,一般公交车上都有售票员(BusConductor),当然无人售票车要除外了。售票员(BusConductor)除了收取乘客(Passenger)的车费还起着监控的作用。下面让我们看看这个过程该如何实现呢?  1、我们先定义售票员(BusConductor)接口类: p

lxgljj的专栏 4019

设计模式—行为型-Observer(观察者)

设计模式—行为型-Observer(观察者)       1. 意图     定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。      2. 结构图           3. 简述   Subject目标是一个个数据模块。Observer观察者是观察这些数据模块并向用户做出展示的对象。MVC

TechTiger的博客 1137

The Observer Design Pattern

listeners;Picture 1:Picture 2:Picture 3:White ballRed ballHintsTo dodeclared.Fantastic.observer?Ball.javaMain.java。

tyytareyou4的博客 163
上一篇: 了解GRASP模式
下一篇: Jsp转Html页面的方法
junjunbest
博客等级 码龄19年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值