zoukankan      html  css  js  c++  java
  • 设计模式之-观察者模式

    观察者模式(Observer)
    完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
     
    观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
     
    我觉得百度的这个涂就很详细的画出了他们之间的关系
    • Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
    • SubjectBookstore:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
    • Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
    • ConcrereStudent:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

    下面举个栗子:

    比如  有群小学生喜欢看七龙珠漫画,但是书店现在没有,等书店进了新书以后,然后书店去通知小学生前来购买漫画,

    这样小学生就是观察者  书店就是被观察者。

    定义观察者的抽象:

    /**
     * 抽象观察者
     * Created by Administrator on 2017/3/13.
     *
     * 定义一个接口,可以让被观察者更新时主动通知自己
     */
    
    public interface Observer {
            void update(String message);
    }

    定义观察者的实现-小学生:

    /**
     * 具体观察者-小学生
     * Created by Administrator on 2017/3/13.
     * 具体观察者实现抽象观察者接口,可以在收到更新通知后更改自己状态
     */
    public class ObserverStudent implements Observer {
    
        private String userName;
    
        public ObserverStudent(String userName) {
            this.userName = userName;
        }
    
        @Override
        public void update(String message) {
            System.out.println(userName + "接到通知:" + message+"-放学就来买!");
        }
    }

    -----------------------------------------------------------------------------------------------------

    定义被观察者的抽象:

    /**
     *
     * 抽象的被观察者
     *
     * 1、观察者对象保存在一个集合
     * 2、可以增加和删除观察者对象
     * 3、主动通知观察者
     * Created by Administrator on 2017/3/13.
     */
    public interface Subject {
    
        void addObserver(Observer observer);
    
        void delObserver(Observer observer);
    
        void notifyObserver(String message);
    
    
    
    }

    定义具体的被观察者-书店:

    /**
     *
     * 具体被的观察者,实现被观察中者的接口
     * Created by Administrator on 2017/3/13.
     */
    public class SubjectBookstore implements Subject{
    
        //存放观察者的集合
        private List<Observer> userList = new ArrayList<Observer>();
    
        @Override
        public void addObserver(Observer observer) {
            userList.add(observer);
        }
    
        @Override
        public void delObserver(Observer observer) {
            userList.remove(observer);
        }
    
        @Override
        public void notifyObserver(String message) {
            for(Observer observer :userList){
                observer.update(message);
            }
        }
    }

    》》》》》》测试下

    public class Main {
    
    
        public static void main(String [] args){
            Subject subject = new SubjectBookstore();
    
            Observer ob1 = new ObserverStudent("小凯");
            Observer ob2 = new ObserverStudent("小兰");
            Observer ob3 = new ObserverStudent("小明");
    
    
            subject.addObserver(ob1);
            subject.addObserver(ob2);
            subject.addObserver(ob3);
    
            subject.notifyObserver("七龙珠漫画到了!");
    
    
        }
    }

    测试结果如下:

     以上就简单的实现了观察者模式,不过有优点就有缺点,以后再说!

     
  • 相关阅读:
    关于spring security的若干事情
    .net2005 datagridview 如何获取值改变的单元格的集合??(小弟没有为datagridview添加数据源,也就是说单元格中的数据是手工录入的)
    关于做一个通用打印类的设想,大家谈谈看法
    请教C#,两个类中的变量互访问题
    刚发现了一个问题,关于vs2005 datagridview的,我发现在设计行标头的HeaderCell.Value的时候要是设置RowTemplate.Height 的值>= 17则行标头的那个黑三角就显示出来了,要是小于17就不能显示了,想问问大家,是怎么回事?
    软件架构模式基本概念及三者区别
    以英雄联盟的方式建模,谈对依赖注入(DI)的理解以及Autofac的用法(一)
    适配器模式
    [翻译] WCF运行时架构
    关于synchronized 影响可见性的问题
  • 原文地址:https://www.cnblogs.com/lewskay/p/6542107.html
Copyright © 2011-2022 走看看