美文网首页
设计模式之-观察者模式

设计模式之-观察者模式

作者: MengkZhang | 来源:发表于2019-05-16 09:49 被阅读0次

    观察者模式又称为发布/订阅(Publish/Subscribe)模式,因此我们可以用报纸期刊的订阅来形象的说明:

    报社方负责出版报纸.

    你订阅了该报社的报纸,那么只要报社发布了新报纸,就会通知你,或发到你手上.

    如果你不想再读报纸,可以取消订阅,这样,报社发布了新报纸就不会再通知你.

    理解其实以上的概念,就可以理解观察者模式,观察者模式中有主题(Subject)和观察者(Observer),分别对应报社和订阅用户(你).观察者模式定义了对象之间的一对多的依赖关系,这样,当"一"的一方状态发生变化时,它所依赖的"多"的一方都会收到通知并且自动更新

    定义

    对象间的一种一个对多的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。

    介绍

    • 观察者属于行为型模式。
    • 观察者模式又被称作发布/订阅模式。
    • 观察者模式主要用来解耦,将被观察者和观察者解耦,让他们之间没有没有依赖或者依赖关系很小。

    UML类图


    角色说明
    • Subject(抽象主题):又叫抽象被观察者,把所有观察者对象的引用保存到一个集合里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
    • ConcreteSubject(具体主题):又叫具体被观察者,将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
    • Observer (抽象观察者):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
    • ConcrereObserver(具体观察者):实现抽象观察者定义的更新接口,当得到主题更改通知时更新自身的状态。

    实现

    以送快递为例,快递员有时只是把快递拉到楼下,然后就通知收件人下楼去取快递
    1 创建抽象观察者

        public interface Observer {//抽象观察者
            public void update(String message);//更新方法
        }
    

    2 创建具体观察者
    实现抽象观察者中的方法,这里创建两个类,一个男孩类和一个女孩类,定义他们收到通知后的反应:

        public class Boy implements Observer {
    
            private String name;//名字
            public Boy(String name) {
                this.name = name;
            }
            @Override
            public void update(String message) {//男孩的具体反应
                System.out.println(name + ",收到了信息:" + message+"屁颠颠的去取快递.");
            }
        }
    
        public class Girl implements Observer {
    
            private String name;//名字
            public Girl(String name) {
                this.name = name;
            }
            @Override
            public void update(String message) {//女孩的具体反应
                System.out.println(name + ",收到了信息:" + message+"让男朋友去取快递~");
            }
        }
    

    3 创建抽象主题
    即抽象被观察者,定义添加,删除,通知等方法:

    public interface  Observable {//抽象被观察者
             void add(Observer observer);//添加观察者
     
             void remove(Observer observer);//删除观察者
        
             void notify(String message);//通知观察者
     }
    

    4 创建具体主题
    即具体被观察者,也就是快递员,派送快递时根据快递信息来通知收件人让其来取件:

        public class Postman implements  Observable{//快递员
            
            private List<Observer> personList = new ArrayList<Observer>();//保存收件人(观察者)的信息
            @Override
            public void add(Observer observer) {//添加收件人
                personList.add(observer);
            }
    
            @Override
            public void remove(Observer observer) {//移除收件人
                personList.remove(observer);
    
            }
    
            @Override
            public void notify(String message) {//逐一通知收件人(观察者)
                for (Observer observer : personList) {
                    observer.update(message);
                }
            }
        }
    

    5 客户端测试

        public void test(){
            Observable postman=new Postman();
            
            Observer boy1=new Boy("路飞");
            Observer boy2=new Boy("乔巴");
            Observer girl1=new Girl("娜美");
    
            postman.add(boy1);
            postman.add(boy2);
            postman.add(girl1);
            
            postman.notify("快递到了,请下楼领取.");
        }
    

    输出结果:

    路飞,收到了信息:快递到了,请下楼领取.屁颠颠的去取快递.
    乔巴,收到了信息:快递到了,请下楼领取.屁颠颠的去取快递.
    娜美,收到了信息:快递到了,请下楼领取.让男朋友去取快递~

    相关文章

      网友评论

          本文标题:设计模式之-观察者模式

          本文链接:https://www.haomeiwen.com/subject/jmdbaqtx.html