栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

设计模式系列(1)- 状态模式 、观察者模式

设计模式系列(1)- 状态模式 、观察者模式

状态模式 简介

状态模式,就是维护多种不同的状态,每种状态下可以去执行一些特殊的逻辑。然后由一个Context类负责根据请求参数调用,来维护这些状态之间的切换,形成一个状态机的概念。

状态模式里,非常重要的一点就是将状态之间流转的逻辑,封装在Context类里面。本来可能需要调用方自己维护复杂的状态流转逻辑,流转到不同的状态之后,执行状态对应的代码逻辑。

使用场景

这个状态模式,在电商系统中有天然的运用场景,系统中很多数据都有大量的状态变更的逻辑,像订单,出库单等等,我们可以将状态变更的逻辑用状态模式来实现,将状态流转封装在一个地方,每次状态变更就通知那个组件,让状态流转,同时执行状态对应的代码逻辑

电商订单,状态需要从新建、待支付、支付、已完成,四个状态之间流转,流转到每个状态的时候,都需要执行那个状态对应的一个逻辑

代码示例
package com.wc.designpattern.state;


public class StatePatternApplication {
    private static final int TO_BE_PAY_STATE = 1;
    private static final int PAY_STATE = 2;
    private static final int FINISH_STATE = 3;

    interface State {
        void exec();
    }

    static class NewState implements State {

        @Override
        public void exec() {
            System.out.println("执订单新建状态逻辑");
        }
    }

    static class ToBePayState implements State {

        @Override
        public void exec() {
            System.out.println("执行订单待支付状态逻辑");
        }
    }

    static class PayState implements State {

        @Override
        public void exec() {
            System.out.println("执行订单已支付状态逻辑");
        }
    }

    static class FinishedState implements State {

        public void exec() {
            System.out.println("执行订单已完成状态的逻辑");
        }

    }

    static class Context {
        private State state;

        public Context(State state) {
            this.state = state;
            this.state.exec();
        }

        public void exec(int stateType) {
            if (stateType == TO_BE_PAY_STATE) {
                this.state = new ToBePayState();
                this.state.exec();
            } else if (stateType == PAY_STATE) {
                this.state = new PayState();
                this.state.exec();
            } else if (stateType == FINISH_STATE) {
                this.state = new FinishedState();
                this.state.exec();
            }
        }
    }

    public static void main(String[] args) {
        Context context = new Context(new NewState());
        context.exec(TO_BE_PAY_STATE);
        context.exec(PAY_STATE);
        context.exec(FINISH_STATE);
    }
}
测试

执行Main函数,得到执行结果

执订单新建状态逻辑
执行订单待支付状态逻辑
执行订单已支付状态逻辑
执行订单已完成状态的逻辑

Process finished with exit code 0
观察者模式 简介

观察者模式还是非常常用的,常见于基于zookeeper进行分布式系统之间的协调工作,比如分布式锁的注册以及监听是否释放。还有就是两个系统之间如果做了异步的处理,那么如果A系统发送异步请求给了B系统,但是要得到B系统的一个状态改变的消息,可以采用观察者模式。

使用场景

在Zookeeper中的监听回调机制,以及分布式锁,都是使用了观察者模式。

基于zookeeper去做分布式锁

(1)系统A尝试获取zookeeper上的一个锁,获取到了

(2)系统B尝试获取zookeeper上的一个锁,被系统A给锁了,没有获取到锁,此时系统B在zookeeper上可以注册一个监听器(观察者)

(3)系统A一旦将锁给释放了,zookeeper感受到锁被释放了,就会立即通知系统B注册的那个监听器

(4)系统B就立即被通知到了,系统A释放了锁,系统B可以重新尝试在zookeeper上加锁

电商系统里,也有这种场景,如果两个系统之间走了异步请求,那么可以基于上面那种观察者模式现在一个进程内实现监听,以后拆分微服务分布式架构了,可以改成基于zookeeper来做分布式协调。

系统A发送了一条消息到内存队列,系统B获取了消息开始执行操作

但是系统A需要知道系统B的一个执行的结果如何,

此时系统A需要注册一个观察者到系统B上去,系统B执行完了之后,将执行的结果,反过来通知给系统

我们就可以基于观察者模式去做。

代码示例
package com.wc.designpattern.observable;

import java.util.Observable;
import java.util.Observer;

public class ObservablePatternApplication {

    static class Subject extends Observable {
        private Integer state;

        public Integer getState() {
            return state;
        }

        public Subject(Integer state) {
            this.state = state;
        }

        public void setState(Integer state) {
            //在这里状态就改变了
            this.state = state;
            //这里状态发生改变之后,要通知关联的一些观察者,说状态发生了改变
            this.setChanged();
            this.notifyObservers();
        }
    }

    static class ConcreteObserver implements Observer {

        @Override
        public void update(Observable o, Object arg) {
            Subject subject = (Subject) o;
            Integer state = subject.getState();
            System.out.println("目标对象的状态已经改变为:" + state);
        }
    }

    public static void main(String[] args) {
        Subject subject = new Subject(0);
        Observer observer = new ConcreteObserver();
        subject.addObserver(observer);

        subject.setState(5);
        subject.setState(2);
    }
}
测试

执行Main函数,得到执行结果

目标对象的状态已经改变为:5
目标对象的状态已经改变为:2

Process finished with exit code 0
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/676824.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号