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设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • Android中涉及的模式

    我的Java设计模式-建造者模式 我的Java设计模式-观察者模式 重学设计模式之单例模式

  • java建造者模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java单例模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java外观模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java适配器模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java观察者模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java代理模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java策略模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • 浅析Java设计模式【1】——观察者

    前情内容 浅析Java设计模式【1】——观察者 浅析Java设计模式【2】——适配器 浅析Java设计模式【3】—...

网友评论

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

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