首页 > 其他分享 >观察者模式

观察者模式

时间:2024-09-05 10:26:13浏览次数:12  
标签:角色 void 观察者 模式 Watcher watcher public

观察者模式

观察者模式又称为模型(MODEL)-视图(VIEW)模式、源-收听者(Lister)模式或从属者模式。

 

主要概念:一个目标物件管理所有想依赖于它的观察者物件,并且在它本身的状态改变时主动发出通知,这通常通过呼叫各观察者所提供的方法来实现。

 

观察者模式是一种对象行为模式。它定义对象的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。

 

现实的例子: 拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。

 

 

下面我们就来看看观察者模式的组成部分。
1) 抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。
2) 抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现。
3) 具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer对象。当它的状态发生改变时, 向它的各个观察者发出通知。
4) 具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject对象的引用。

 

优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

 

 

用法:

首先定义抽象的观察者:

public interface Watcher
    {
            public void update(String str);

    }

定义抽象的主题角色,即抽象的被观察者,在其中声明方法(添加、移除观察者,通知观察者):

//抽象主题角色,watched:被观察
    public interface Watched
    {
            public void addWatcher(Watcher watcher);

            public void removeWatcher(Watcher watcher);

            public void notifyWatchers(String str);

    }

然后定义具体的观察者:

public class ConcreteWatcher implements Watcher
    {

            @Override
            public void update(String str)
            {
                    System.out.println(str);
            }

    }

之后是具体的主题角色:

import java.util.ArrayList;
    import java.util.List;

    public class ConcreteWatched implements Watched
    {
            // 存放观察者
            private List<Watcher> list = new ArrayList<Watcher>();

            @Override
            public void addWatcher(Watcher watcher)
            {
                    list.add(watcher);
            }

            @Override
            public void removeWatcher(Watcher watcher)
            {
                    list.remove(watcher);
            }

            @Override
            public void notifyWatchers(String str)
            {
                    // 自动调用实际上是主题进行调用的
                    for (Watcher watcher : list)
                    {
                        watcher.update(str);
                    }
            }

    }

编写测试类:

public class Test
    {
            public static void main(String[] args)
            {
                    Watched girl = new ConcreteWatched();
        
                    Watcher watcher1 = new ConcreteWatcher();
                    Watcher watcher2 = new ConcreteWatcher();
                    Watcher watcher3 = new ConcreteWatcher();
        
                    girl.addWatcher(watcher1);
                    girl.addWatcher(watcher2);
                    girl.addWatcher(watcher3);
        
                    girl.notifyWatchers("测试ok");
            }

    }

这个就是简单的观察者模式



标签:角色,void,观察者,模式,Watcher,watcher,public
From: https://blog.51cto.com/liFrans/11926356

相关文章

  • 外观设计模式
    外观模式(Facade模式) 当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。......
  • 【适配器】设计模式:旧系统迁移与第三方库集成的解决方案
    引言适配器设计模式是一种结构设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器让那些接口不兼容的类可以一起工作。这种模式在系统集成、插件开发和第三方库集成中尤为重要。核心组件:目标接口(ITarget):期望的接口,要转化成的接口定义,客户端将使用这个接......
  • 手游后端架构中,用命令模式解决什么问题
    Hello,大家好,我是V哥。命令模式(CommandPattern)是一种行为设计模式,它将一个请求封装为一个对象,从而允许用户使用不同的请求、队列或日志请求来参数化其他对象。命令模式也支持可撤销的操作。在手游后端架构中,命令模式可以将玩家的操作请求(如移动、攻击、技能释放等)封装成......
  • 51单片机 - 定时器0(按键控制LED流水灯模式)
    时间:2024.9.2目的:手撕51作者:Whappy定时器0寄存器配置1.定时器0配置过程首先要配置定时器的寄存器TCON和TMOD使计数器开始计数及定时器的初始值,配置使这个链路连起来。#include<REGX52.H>voidTimer0_Init(){ TMOD=0x01;//工作模式寄存器 //控制寄存器 TF......
  • 数字人直播阿凡达模式2.0版本揭秘:灰豚运用了哪些黑技术?
    随着数字人直播的应用频率不断提升,其在帮助企业降本增效方面的潜力也随之显现,刺激市场需求的同时,也让用户对它的期待值持续增长。在此背景下数字人源码厂商开始不断加大研发力度,以推动数字人直播技术的持续升级,数字人直播阿凡达模式2.0版本的上线便是典型案例之一。本期,小编......
  • C#设计模式入门实战教程
    思维导航什么是设计模式设计模式的作用设计模式分类创建型模式(CreationalPatterns)结构型模式(StructuralPatterns)行为型模式(BehavioralPatterns)C#实现的设计模式示例代码推荐学习书籍项目源码地址优秀项目和框架精选什么是设计模式设计模式是对面向对象设计中......
  • 设计模式-离线并发模式-隐含锁(Implicit Lock)
    作用允许框架或层超类型代码来获取离线锁锁机制应该由应用隐含的完成,而不是由开发人员编写代码完成,这样可以避免编写锁代码的疏忽而造成的数据不一致等情况。实现机制实现隐含锁就是要分解代码,在应用程序框架中完成那些无法逾越的锁机制。在悲观离线锁的任务中,会出现两......
  • 设计模式-粗粒度锁(Coarse-Grained Lock)
    作用用一个锁所住一组相关的对象粗粒度锁是覆盖多个对象的单个锁,这样不仅简化了加锁行为本身,而且让你不必为了给它们加锁所而加载所有的对象。运行机制实现粗粒度锁的第一步是为一组对象建立一个控制点,使得只用一个锁就能锁住多个对象。用乐观离线锁让组中每个对象都共享......
  • 图穷匕见-所有反DDD模式都是垃圾
    本文书接上回《主观与客观,破除DDD凭经验魔咒》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术实现交流;视频和直播在B站。开个玩笑“我不是针对这一个问题,我是说所有的反DDD模式都是垃圾”,作为教练,在团队中我时常用这样的玩笑来......
  • 结构型设计模式—桥接模式
    结构型设计模式—桥接模式欢迎长按图片加好友,我会第一时间和你分享持续更多的开发知识,面试资源,学习方法等等。假设你要买一张新桌子,你有两个选择:一种是木制的桌子,另一种是金属制的桌子。无论你选择哪种材质,你还希望这张桌子可以有不同的颜色,比如红色、蓝色或者绿色。如......