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

设计模式之观察者模式

作者: Tinyspot | 来源:发表于2023-02-13 12:44 被阅读0次

    1. 观察者模式

    • 观察者模式(Observer Pattern)
    • 观察者模式又叫作发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependent)模式
    • 一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,每当主题对象状态变化时,所有依赖它的对象都会得到通知并被自动更新

    观察者模式的核心是将观察者与被观察者解耦,以类似消息/广播发送的机制联动两者,使被观察者的变动能通知到感兴趣的观察者们,从而做出相应的响应

    1.1 组成

    • 抽象主题(ISubject):指被观察的对象(IObservable)
    • 具体主题(ConcreteSubject):具体被观察者
    • 抽象观察者(IObserver):定义响应通知的更新方法
    • 具体观察者(ConcreteObserver):当得到状态更新的通知时,会自动做出响应

    2. 示例

    注册观察者,订阅主题(subject)

    /**
     * 主题:被观察者
     */
    public interface ISubject {
        void notify(String event);
        boolean register(IObservable observable);
        boolean remove(IObservable observable);
    }
    
    public class ConcreteSubject implements ISubject {
    
        private List<IObservable> observables = new ArrayList<>();
    
        @Override
        public boolean register(IObservable observable) {
            return !this.observables.contains(observable) && this.observables.add(observable);
        }
    
        @Override
        public boolean remove(IObservable observable) {
            return this.observables.remove(observable);
        }
    
        @Override
        public void notify(String event) {
            for (IObservable observable : this.observables) {
                observable.handler(event);
            }
        }
    }
    

    Observer 接口,它将不同的观察者聚合在一起

    /**
     * 观察者:监听被观察者的变化
     */
    public interface IObservable {
        void handler(String event);
    }
    
    public class ConcreteObserverA implements IObservable {
        @Override
        public void handler(String event) {
            System.out.println("concrete observer A: " + event);
        }
    }
    
    public class ConcreteObserverB implements IObservable {
        @Override
        public void handler(String event) {
            System.out.println("concrete observer B: " + event);
        }
    }
    

    测试:

    @Test
    public void test() {
        ISubject subject = new ConcreteSubject();
        subject.register(new ConcreteObserverA());
        subject.register(new ConcreteObserverB());
        subject.notify("test");
    }
    

    相关文章

      网友评论

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

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