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

  • 相关阅读:
    【Uvalive4960】 Sensor network (苗条树,进化版)
    【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
    【UVA 1395】 Slim Span (苗条树)
    【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
    【UVA 10369】 Arctic Network (最小生成树)
    【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
    【UVA 11183】 Teen Girl Squad (定根MDST)
    【UVA 11865】 Stream My Contest (二分+MDST最小树形图)
    【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
    【LA 5713 】 Qin Shi Huang's National Road System (MST)
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10732416.html
Copyright © 2011-2022 走看看