• 观察者模式


    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

  • 相关阅读:
    apollo实现c#与android消息推送(三)
    apollo实现c#与android消息推送(二)
    apollo实现c#与android消息推送(一)
    成为架构师,需要哪些技能
    Centos 7.x Smokeping部署安装及使用
    ISIS实验配置
    Netty网编程实战:四种解决粘包方式切换、两种生产级双向监听模式并行、高效编解码、多处理器协同作战
    STP+基于LACP的portchannel 实验分享
    Java基础之反射
    IntelliJ IDEA 可以使用中文了
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10732416.html
Copyright © 2020-2023  润新知