zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者模式

    观察者模式又称为模型(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");
                }
    
        }

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

  • 相关阅读:
    2月份热门的 24 个 jQuery 插件
    走近求伯君1 求伯君,1964年11月26日出生于浙江新昌县。
    转CSDN,13原则
    SQL Server数据库如何正确加密?
    Zend Studio提供zend studio教程、zend studio下载等相关资源的公益性站点。 订阅
    高端人才必看,生意人必读
    有速度才有效率,支持Google gear离线的网站和应用
    2009.08.20总结与微软中国开发部经理段老师的通话无锡德立解决方案
    从SOA、SaaS到博科自主配置平台
    MySQL 1045错误的解决方法
  • 原文地址:https://www.cnblogs.com/LixiaoFeng1650062546/p/11455337.html
Copyright © 2011-2022 走看看