zoukankan      html  css  js  c++  java
  • 观察者模式

    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

  • 相关阅读:
    java监听者模式
    使用tc编写流量控制脚本
    Android apk集成
    就这样
    嘴不笨来试试??太好玩儿了,看看谁厉害?
    老板的三句话
    电脑设置wifi
    JDBC
    使用git的一般操作
    模板引擎Velocity学习系列
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10732416.html
Copyright © 2011-2022 走看看