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

设计模式之观察者模式

作者: Mr_Qiang | 来源:发表于2021-11-10 11:23 被阅读0次

    定义

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
      观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

    角色

    • 主题角色(Subject)

    把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,在具体主题的内部状态改变时,给所有登记过的观察者发出通知

    • 抽象观察者(Observer)

    为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。

    • 具体观察者(ConcreteObserver)

    通过构成把具体的观察者加入到主题容器中,实现具体的更新方法,在得到通知后。

    观察者模式结构图

    ItEJDe.png

    观察者模式利弊

    例子

    • 主题角色,提供保存观察者对象的容器,提供了通知的方法
    public class Subject {
    
        List<Observer> observers = new ArrayList();
        Integer state;
    
        public void attach(Observer observer) {
            observers.add(observer);
        }
    
        public void notifyAllObservers() {
            for (Observer observer : observers) {
                observer.update();
            }
        }
    
        public List<Observer> getObservers() {
            return observers;
        }
    
        public void setObservers(List<Observer> observers) {
            this.observers = observers;
        }
    
        public Integer getState() {
            return state;
        }
    
        public void setState(Integer state) {
            this.state = state;
        }
    }
    
    • 抽象观察者,持有主题的引用,提供了抽象的更新方法
    public abstract class Observer {
    
        public Subject subject;
    
        public abstract void update();
    }
    
    
    • 具体观察者一,BinaryObserver
    public class BinaryObserver extends Observer {
    
        public BinaryObserver(Subject subject) {
            this.subject = subject;
            subject.attach(this);
        }
    
        @Override
        public void update() {
            Integer subjectState = subject.getState();
            String binaryStr = Integer.toBinaryString(subjectState);
            System.out.println("Binary Observer update ,binary String: " + binaryStr);
    
        }
    }
    
    • 具体观察者二,HexObserver
    public class HexObserver extends Observer {
    
        public HexObserver(Subject subject) {
            this.subject = subject;
            subject.attach(this);
    
        }
    
        @Override
        public void update() {
            Integer state = subject.getState();
            String hexStr = Integer.toHexString(state);
            System.out.println("HexObserver update,hex String: " + hexStr);
        }
    }
    
    • 具体观察者三,OctObserver
    public class OctObserver extends Observer {
        public OctObserver(Subject subject) {
            this.subject = subject;
            subject.attach(this);
    
        }
    
        @Override
        public void update() {
            Integer state = subject.getState();
            String octStr = Integer.toOctalString(state);
            System.out.println("OctObserver update ,oct String : " + octStr);
        }
    }
    
    • 测试
    public class BaseConversionDemo {
    
    
        public static void main(String[] args) {
            Subject subject = new Subject();
    
            new BinaryObserver(subject);
            new HexObserver(subject);
            new OctObserver(subject);
            System.out.println("############ String value :15 ############");
            subject.setState(15);
            subject.notifyAllObservers();
        }
    }
    -------------------------------------------------
    ############ String value :15 ############
    Binary Observer update ,binary String: 1111
    HexObserver update,hex String: f
    OctObserver update ,oct String : 17
    

    相关文章

      网友评论

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

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