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

设计模式-观察者模式

作者: ZjyMac | 来源:发表于2018-05-07 13:57 被阅读0次

    一,观察者模式详解

    • 概念
      定义对象之间的一种一对多的依赖关系,使得每当一个对象状态改变,相关依赖的对象都会得到通知并被自动更新。
    • 使用场景
      (1)一个抽象模型,有两个方面,其中一个方面依赖另外一个方面。
      (2)一个对象的改变,导致一个或多个对象发生改变
      (3)需要在系统中创建一个触发链
    • UML
    image.png
    • 代码示例
    • 第一种写法
    public interface Oberver {
        void update(String newState);
    }
    
    public abstract class Subject {
        //保存观察者对象
        private List<Oberver> obervers = new ArrayList<>();
    
        public void attach(Oberver oberver) {
            obervers.add(oberver);
    
        }
    
        public void detach(Oberver oberver) {
            obervers.remove(oberver);
        }
        //通知所有注册观察者对象
        public void notifyObservers(String newState){
            for (Oberver observer:obervers){
                observer.update(newState);
            }
    
        }
    }
    
    public class ConcreteObserver implements Oberver {
        private String observerState;
        @Override
        public void update(String newState) {
            observerState=newState;
        }
    }
    
    public class ConcreteSubject extends Subject{
        private String state;
        public String getState(){
            return state;
        }
        public void change(String newState){
            state=newState;
            notifyObservers(state);
        }
    
    }
    
    
      ConcreteSubject concreteSubject = new ConcreteSubject();
            Oberver oberver = new ConcreteObserver();
            concreteSubject.attach(oberver);
            concreteSubject.change("I change");
    
    • 第二种写法(java提供的类)
    public class TargetObserver implements Observer {
        private String name;//观察者名称
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public void update(Observable o, Object arg) {
            ((TargetObservable) o).getNewState();
        }
    }
    
    public class TargetObservable extends Observable {
        private String newState;
    
        public String getNewState() {
            return newState;
        }
    
        public void setNewState(String newState) {
            this.newState = newState;
            this.setChanged();
            this.notifyObservers(newState);
        }
    }
    
      TargetObservable targetObservable=new TargetObservable();
            TargetObserver targetObserver=new TargetObserver();
            targetObservable.addObserver(targetObserver);
            targetObservable.setNewState("hello");
    

    ···
    TargetObservable targetObservable = new TargetObservable();
    TargetObserver targetObserver = new TargetObserver();
    targetObservable.addObserver(targetObserver);
    targetObservable.setNewState("hello");
    ···

    • 两种写法区别
      (1)java中用的不是list而是Vector
      原因是 线程安全
      (2)Vector是否有替代品
      有 CopyOnWriteArrayList也是线程安全的

    二,android中的实际应用

    • 回调模式
      image.png

    Button为被观察者,onClickListener为观察者

    • Listview中的notifyDataChanged

    • Rxjava中的观察者模式的运用

    相关文章

      网友评论

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

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