• 设计模式——观察者模式


    现在安卓开发需要用到RxJava Retrofit,而RxJava是观察者模式,于是去看了下观察者模式是怎么个回事。

    大概意思应该是 A监视B 但是A并非实时监视B,而是给B注册一个事件,在B发生某种动作(事件)之后通知A,然后A再做出相应的响应。

    代码:

    ObServer:
    package com.example.z.tabview.test.gczms;
    
    /**
     * 抽象观察者
     * Created by Z on 2017/6/6.
     */
    
    public interface ObServer {
    
        void update(Subject subject);
    }
    ConcreteObServer:
    package com.example.z.tabview.test.gczms;
    
    /**
     * 具体的观察者
     * Created by Z on 2017/6/6.
     */
    
    public class ConcreteObServer implements ObServer {
    
        private int state;
    
        @Override
        public void update(Subject subject) {
            this.state = ((ConcreteSubject) subject).getState();
        }
    
        public int getState() {
            return state;
        }
    
        public void setState(int state) {
            this.state = state;
        }
    }
    Subject:
    package com.example.z.tabview.test.gczms;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 抽象主题对象
     * Created by Z on 2017/6/6.
     */
    
    public class Subject {
        //保存该主题下的所有观察者
        protected List<ObServer> listObserver = new ArrayList<>();
    
        public void registerObserver(ObServer obServer) {
            listObserver.add(obServer);
        }
    
        public void removeObserver(ObServer obServer) {
            listObserver.remove(obServer);
        }
    
        public void notifyAllObserver() {
    
            for (ObServer obServer : listObserver) {
                obServer.update(this);
            }
    
        }
    
    }
    ConcreteSubject:
    package com.example.z.tabview.test.gczms;
    
    /**
     * 具体主题对象
     * Created by Z on 2017/6/6.
     */
    
    public class ConcreteSubject extends Subject {
        private int state;
    
        public int getState() {
            return state;
        }
    
        public void setState(int state) {
            this.state = state;
            this.notifyAllObserver();
        }
    }

    Test:

    package com.example.z.tabview.test.gczms;
    
    /**
     * 测试方法
     * Created by Z on 2017/6/6.
     */
    
    public class Test {
    
    
        public static void main(String[] args) {
            ConcreteSubject cs = new ConcreteSubject();
    
            ConcreteObServer cos1 = new ConcreteObServer();
            ConcreteObServer cos2 = new ConcreteObServer();
            ConcreteObServer cos3 = new ConcreteObServer();
    
            cos1.setState(10);
            cos2.setState(20);
            cos3.setState(30);
    
    
            System.out.println(cos1.getState());
            System.out.println(cos2.getState());
            System.out.println(cos3.getState());
    
            System.out.println("----------修改后的状态----------");
    
            cs.registerObserver(cos1);
            cs.registerObserver(cos2);
            cs.registerObserver(cos3);
    
            cs.setState(100);
    
            System.out.println(cos1.getState());
            System.out.println(cos2.getState());
            System.out.println(cos3.getState());
        }
    
    
    }
    输出:
    10
    20
    30
    ----------修改后的状态----------
    100
    100
    100
     
     
  • 相关阅读:
    各种数据库连接代码(转)
    面向服务架构(SOA)的原则(转)
    运用API函数获取系统信息(转)
    7种程序员的素质
    一种通过sql server的作业调度+存储过程来建立自动备份的方法
    数据库设计方法、规范与技巧(转)
    部署托管代码中的 XML Web services
    Procedure 存储过程(转)
    判断数字函数
    asp.net中窗口相关操作总结(javascript)
  • 原文地址:https://www.cnblogs.com/6324/p/6952083.html
Copyright © 2020-2023  润新知