• 设计模式之 观察者模式


    观察者模式

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    观察者模式也叫发布订阅模式,她主要是用来解决通知问题的,为了保证系统的高度协同,同时还要低耦合,这时我们就可以使用观察者模式。

    比如说:现在我在博客园发了一篇文章,什么人会看到我发的文章呢?第一种就是搜索了,通过搜索引擎找到,还有就是关注我,这样我就可以查询关注我的人,然后一个一个通知他们我发送了一篇文章。至于关注我的人会不会去阅读我就不太清楚了。

    在我们开发项目的过程中,通常会遇到:如果记录被修改了,我应该怎么怎么办。我们会在一个业务类中引入其他业务类,然后修改记录后就调用其他的业务类。比如说,如果用户下单购买了一件物品,我们会调用短信接口通知商家、向客户发送一条购买成功的系统通知、更新购物车等等。如果我们在下单的业务类中引入一堆处理短信的业务类、发送系统通知的业务类等等操作,就会使业务逻辑变得复杂起来,如果还需要添加其他的操作,就会使得下单的逻辑和其他业务紧紧关联在一起,不利于扩展。

    这时我们就可以使用观察者模式来改造这个业务。

    我们先来看下 类图

    image-20201205004012998

    我们试着来使用代码来实现处理逻辑

    package observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 观察者模式:
     * 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
     *
     * @author lixin
     */
    public class ObserverDemo {
        public static void main(String[] args) {
    
            PlaceAnOrderSubject subject = new PlaceAnOrderSubject();
            new SmsPlaceAnOrderObserver(subject);
            new SysMsgPlaceAnOrderObserver(subject);
            new ShopCartPlaceAnOrderObserver(subject);
    
            // 业务处理成功
            subject.notifySuccess();
    
            // 业务处理失败
            //subject.notifyFail();
    
        }
    }
    
    /**
     * 下单操作,下单主题
     */
    class PlaceAnOrderSubject {
        private final List<AbstractPlaceAnOrderObserver> observers = new ArrayList<>();
    
        /**
         * 订单状态控制
         */
        private int state;
    
        public int getState() {
            return state;
        }
    
        public void setState(int state) {
            this.state = state;
        }
    
        /**
         * 注册
         *
         * @param observer 下单后处理类
         */
        public void register(AbstractPlaceAnOrderObserver observer) {
            observers.add(observer);
        }
    
        /**
         * 注销
         *
         * @param observer 下单后处理类
         */
        public void cancellation(AbstractPlaceAnOrderObserver observer) {
            observers.remove(observer);
        }
    
        /**
         * 下单成功通知已经注册的对象
         */
        public void notifySuccess() {
            for (AbstractPlaceAnOrderObserver observer : observers) {
                observer.success();
            }
        }
    
        /**
         * 下单失败通知已经注册的对象
         */
        public void notifyFail() {
            for (AbstractPlaceAnOrderObserver observer : observers) {
                observer.fail();
            }
        }
    
    }
    
    /**
     * 下单后处理抽象类
     */
    abstract class AbstractPlaceAnOrderObserver {
        protected PlaceAnOrderSubject subject;
    
        /**
         * 成功通知
         */
        public abstract void success();
    
        /**
         * 失败通知
         */
        public abstract void fail();
    }
    
    /**
     * 发送短信处理
     */
    class SmsPlaceAnOrderObserver extends AbstractPlaceAnOrderObserver {
    
        SmsPlaceAnOrderObserver(PlaceAnOrderSubject subject) {
            this.subject = subject;
            this.subject.register(this);
        }
    
        @Override
        public void success() {
            System.out.println("短信发送:你的订单下单成功");
        }
    
        @Override
        public void fail() {
            System.out.println("短信发送:你的订单下单失败");
        }
    }
    
    /**
     * 发送系统消息
     */
    class SysMsgPlaceAnOrderObserver extends AbstractPlaceAnOrderObserver {
    
        SysMsgPlaceAnOrderObserver(PlaceAnOrderSubject subject) {
            this.subject = subject;
            this.subject.register(this);
        }
    
        @Override
        public void success() {
            System.out.println("发送系统消息:你的订单下单成功");
        }
    
        @Override
        public void fail() {
            System.out.println("发送系统消息:你的订单下单失败");
        }
    }
    
    /**
     * 购物车处理
     */
    class ShopCartPlaceAnOrderObserver extends AbstractPlaceAnOrderObserver {
    
        ShopCartPlaceAnOrderObserver(PlaceAnOrderSubject subject) {
            this.subject = subject;
            this.subject.register(this);
        }
    
        @Override
        public void success() {
            System.out.println("购物车处理:你的订单下单成功");
        }
    
        @Override
        public void fail() {
            System.out.println("购物车处理:你的订单下单失败");
        }
    }
    
    
  • 相关阅读:
    JQuery FlexiGrid的asp.net完美解决方案:dotNetFlexGrid.Net原生的异步表格控件 简介和应用效果截图
    利用View静态画图
    Context部分译(http://developer.android.com/reference/android/content/Context.html))
    java 利用Scanner解析逗号字符串
    Canvas
    SurfaceView部分译
    handler
    Centos7上安装jdk8
    Opera 使用迅雷下载
    fopen()
  • 原文地址:https://www.cnblogs.com/lixingwu/p/14095031.html
Copyright © 2020-2023  润新知