码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式

时间:2019-04-18 21:40:05      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:import   html   integer   实体   修改   cte   protect   static   int   

1.观察者模式简介

当对象间存在一对多关系时,则可使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者
模式属于行为型模式。

使用场景:
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

注意:目前java中已经有对观察者进行支持的类。


2.实现Demo

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

import java.util.List;
import java.util.ArrayList;

class Subject {
    private int state;
    private List<Observer> lists = new ArrayList<Observer>();

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }

    public void attach(Observer observer) {
        lists.add(observer);
    }

    public void notifyAllObservers() {
        for (Observer observer : lists) {
            observer.update();
        }
    }
}


abstract class Observer {
    protected Subject subject;
    abstract public void update();
}

class BinaryObserver extends Observer {
    public BinaryObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
    }
}

class OctalObserver extends Observer {
    public OctalObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Octal String: " + Integer.toOctalString(subject.getState()));
    }
}

class HexObserver extends Observer {
    public HexObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Hexa String: " + Integer.toHexString(subject.getState()).toUpperCase());
    }
}



public class ObserverPatternDemo {
    public static void main(String args[]) {
        Subject subject = new Subject();

        Observer binaryObserver = new BinaryObserver(subject);
        Observer octalObserver = new OctalObserver(subject);
        Observer hexObserver = new HexObserver(subject);

        subject.setState(10);

        subject.setState(20);
    }
}

 

 

 

参考:http://www.runoob.com/design-pattern/observer-pattern.html

 

观察者模式

标签:import   html   integer   实体   修改   cte   protect   static   int   

原文地址:https://www.cnblogs.com/hellokitty2/p/10732416.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!