java设计模式——观察者模式

作者: Mr_欢先生 | 来源:发表于2017-09-25 15:18 被阅读120次

    1.观察者模式(Observer Pattern)

    当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。例如你简书关注专题:javaEE学习笔记之后,该专题有了文章更新,就会接收到更新通知。

    2.实现方式

    观察者模式

    观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。

    3.步骤

    创建主体题对象

    • Subject.java
    package com.huan.eu.Observer;
    
    import java.util.ArrayList;
    import java.util.List;
    /**
     * Created by 马欢欢 on 2017/9/25.
     */
        public class Subject {
    
            private List<Observer> observers
                    = new ArrayList<Observer>();
            private int state;
    
            public int getState() {
                return state;
            }
    
            public void setState(int state) {
                this.state = state;
                notifyAllObservers();
            }
    
            public void attach(Observer observer){
                observers.add(observer);
            }
    
            public void notifyAllObservers(){
                for (Observer observer : observers) {
                    observer.update();
                }
            }
    }
    

    抽象类

    • Observer.java
    package com.huan.eu.Observer;
    
    public abstract class Observer {
        protected Subject subject;
        public abstract void update();
    }
    

    实体类(二进制和八进制)

    • 1.BinaryObserver.java
    package com.huan.eu.Observer;
    
    
    public class BinaryObserver extends Observer{
    
        public BinaryObserver(Subject subject){
            this.subject = subject;
            this.subject.attach(this);
        }
    
        @Override
        public void update() {
            System.out.println( "二进制: "
                    + Integer.toBinaryString( subject.getState() ) );
        }
    }
    
    • 2.OctalObserver .java
    package com.huan.eu.Observer;
    public class OctalObserver extends Observer{
    
        public OctalObserver(Subject subject){
            this.subject = subject;
            this.subject.attach(this);
        }
    
        @Override
        public void update() {
            System.out.println( "八进制: "
                    + Integer.toOctalString( subject.getState() ) );
        }
    }
    

    测试类:

    • ObserverPatternDemo.java
    package com.huan.eu.Observer;
    
    import org.junit.Test;
    
    public class ObserverPatternDemo {
        @Test
        public  void text() {
            Subject subject = new Subject();
    
            new OctalObserver(subject);
            new BinaryObserver(subject);
    
            System.out.println("十进制: 15");
            subject.setState(15);
            System.out.println("十进制: 10");
            subject.setState(10);
        }
    }
    

    4.优缺点

    • 优点:
      1、观察者和被观察者是抽象耦合的。
      2、建立一套触发机制。
    • 缺点:
      1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
      2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
      3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

    参考学习《菜鸟教程》

    相关文章

      网友评论

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

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