• 设计模式之-观察者模式


    观察者模式(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("七龙珠漫画到了!");
    
    
        }
    }

    测试结果如下:

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

     
  • 相关阅读:
    黑马程序员__OC三大特性
    黑马程序员___OC类和对象
    黑马程序员___预处理指令
    黑马程序员___数据类型总结
    黑马程序员__指针
    黑马程序员__C语言__函数__static和extern
    黑马程序员__C语言__流程控制__选择结构
    黑马程序员__C语言__循环结构
    入园随笔
    Fiddler中抓取不到Jmeter模拟的请求包。
  • 原文地址:https://www.cnblogs.com/lewskay/p/6542107.html
Copyright © 2020-2023  润新知