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

    观察者模式(发布-订阅模式、模型-视图模式),属于对象行为方式:

    解决场景:

    当一个对象改变的时候,所有依赖它的对象都需要得到通知并且针对其改变而改变。

    优缺点:

    目标与观察者之间抽象耦合,使用了触发机制

    但是依赖仍然有,如果目标的观察者(对象依赖)很多会影响效率

    需要的对象:

    目标:会发生改变的对象

    观察者:依赖目标的对象

    事件:发生的改变的抽象类

    事件 - 观察者

    目标 - 事件

    java中有具体的观察者模式类:

    Observable和Observer

    举例:

    百变怪和武藏、小次郎

    Ditto作为目标,WuZang和XiaoCiLang作为观察者(依赖)。当Ditto发生改变时,需要及时观察者及时做出改变

    package com.zang.schema.observable.observer;
    
    import java.util.Observable;
    
    /**
     * java 原生观察者模式
     * Ditto 百变怪
     * 目标类
     * @author Zhang Qiang
     * @Date 2019/8/29 17:44
     */
    public class Ditto extends Observable {
    
        private String transformation;
    
        public String getTransformation() {
            return transformation;
        }
    
        /**
         * 状态改变,通知观察者
         */
        public void setTransformation(String transformation) {
            this.transformation = transformation;
            super.setChanged();
            super.notifyObservers(transformation);
        }
    
    }
    

      

    观察者1:

    package com.zang.schema.observable.observer;
    
    import java.util.Observable;
    import java.util.Observer;
    
    /**
     *
     * @author Zhang Qiang
     * @Date 2019/8/29 17:47
     */
    public class WuZang implements Observer {
    
        @Override
        public void update(Observable o, Object arg) {
            String res = String.valueOf(arg);
            switch (res){
                case "abo":
                    System.out.println("WuZang very like");
                    break;
                case "fw":
                    System.out.println("WuZang not like");
                    break;
                default:
                    System.out.println("WuZang is nothing");
                break;
            }
    
        }
    }
    

      

    观察者2:

    package com.zang.schema.observable.observer;
    
    import java.util.Observable;
    import java.util.Observer;
    
    /**
     * @author Zhang Qiang
     * @Date 2019/8/29 17:51
     */
    public class XiaoCiLang implements Observer {
        @Override
        public void update(Observable o, Object arg) {
            String res = String.valueOf(arg);
            switch (res){
                case "abo":
                    System.out.println("XiaoCiLang very like");
                    break;
                case "fw":
                    System.out.println("XiaoCiLang very like, and some boy");
                    break;
                default:
                    System.out.println("XiaoCiLang is nothing");
                    break;
            }
        }
    }
    

      

    实现:

    public class Action {
    
        public static void main(String[] args) {
    
            new Action().ditto("fw");
    
        }
    
        public void ditto(String dt){
            Ditto ditto = new Ditto();
    
            // 添加观察者(依赖)
            ditto.addObserver(new WuZang());
            ditto.addObserver(new XiaoCiLang());
    
            // 事件发生
            ditto.setTransformation(dt);
        }
    }
    

      

      

  • 相关阅读:
    java注解说明
    paypal
    eclispe查看jdk源码后特别卡顿导致未响应解决
    ubuntu+tomcat,多环境、自动化部署脚本,git+maven+tomcat+ubuntu
    ubuntu+let's encrypt生成永久免费https证书 ubuntu+tomcat+nginx+let's encrypt
    MySQL创建数据库与创建用户以及授权
    linux查找并杀死进程shell
    redmine安装笔记
    C#动态获取本机可用串口的两种方式
    C# 控件缩写规范
  • 原文地址:https://www.cnblogs.com/meijsuger/p/11433727.html
Copyright © 2011-2022 走看看