• 设计模式-状态模式


    状态模式

    定义:当一个对象得内在状态改变时,他的行为也会改变。对有状态的对象,把复杂的"判断逻辑"提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

    使用场景:代码中包含大量与对象状态有关的条件语句。

    注意事项:在行为受状态约束的时候使用,且状态不超过5个。

    模式的结构:

    • 环境类(Context):它定义了客户端需要的接口,内部维护一个当前状态,并负责状态切换
    • 抽象状态(State):定义一个接口,用于封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。
    • 具体状态(Concrete State):实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。

    示例代码:

    public abstract class State {
    
        abstract void createOrder(Context context);
    
        abstract void pay(Context context);
    
        abstract void finishOrder(Context context);
    }
    
    public class Context {
    
        private State state;
    
        public Context() {
            this.state = new OrderInitState();
        }
    
        public State getState() {
            return state;
        }
    
        public void setState(State state) {
            this.state = state;
        }
    
        public void createOrder(){
            state.createOrder(this);
        }
    
        public void pay(){
            state.pay(this);
        }
    
        public void finish(){
            state.finishOrder(this);
        }
    }
    
    public class OrderInitState extends State {
    
    
        @Override
        void createOrder(Context context) {
            System.out.println("订单创建成功");
        }
    
        @Override
        void pay(Context context) {
            System.out.println("支付成功");
            context.setState(new OrderPayState());
        }
    
        @Override
        void finishOrder(Context context) {
            System.out.println("未支付不能完成订单");
        }
    }
    
    public class OrderPayState extends State {
    
        @Override
        void createOrder(Context context) {
            System.out.println("订单已经创建过");
        }
    
        @Override
        void pay(Context context) {
            System.out.println("已经支付过");
        }
    
        @Override
        void finishOrder(Context context) {
            System.out.println("订单完成");
            context.setState(new OrderFinish());
        }
    }
    
    
    
    public class OrderFinish extends State {
    
        @Override
        void createOrder(Context context) {
    
        }
    
        @Override
        void pay(Context context) {
    
        }
    
        @Override
        void finishOrder(Context context) {
            System.out.println("订单已完成");
        }
    }
    

    测试代码:

    public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
            Context context=new Context();
            context.createOrder();
            context.pay();
            context.finish();
        }
    

    返回目录

    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    矩阵学习摘记,欢迎指正
    [poj1363]Rails_模拟_栈
    JLOI2018 记
    [poj3321]Apple Tree_dfs序_树状数组
    [poj3974]Palindrome_Manacher
    [poj1062]昂贵的聘礼_最短路_离散化
    STL:字符串用法详解
    C++ Primer 有感(管理类的指针成员)
    C++ Primer 有感(标准库set类型)
    C++ Primer 有感(标准库pair)
  • 原文地址:https://www.cnblogs.com/javammc/p/14961675.html
Copyright © 2020-2023  润新知