美文网首页Android开发经验谈工作生活Android技术知识
android 源码设计模式读书笔记(五)状态模式

android 源码设计模式读书笔记(五)状态模式

作者: 刘景昌 | 来源:发表于2019-07-04 11:57 被阅读8次

定义:当一个状态改变是允许改变其行为,这个对象看起来像改变了其类。
使用场景:(1)一个对象的行为取决于它的状态,并且运行时根据状态改变其行为。
(2)代码中包含大量与状态相关的条件语句 状态吗模式将一个条件分支放入一个类中,这时使得介意根据自身的状况将队形的状态作为一个对象,这一对象不依赖于其他对象而对立变化,正阳就可以通过多状态去去除多余的if -else 判断
状态模式UML图


image.png

角色介绍
Context: 环境类,定义一个客户端感兴趣的接口,维护一个State子类的实例,定义当前对象状态
State:抽象状态类或状态接口定义一个或一组接口
StateA、StateB:每一个具体实现类的具体抽象

每次到了要考虑应用的时候总是苦思冥想,在想之前在做个地方究竟什么什么地方用到 什么地方可以用 ,这次是在坐车的时候突然的想到
之前在写订单的时候总是会涉及到很多不同的显示小伙和不同逻辑 我们好像在这里使用状态模式特别的合适。
先看下大致的UI图好去设计自己的代码结构


image.png

我们分析下异同进行代码UML
首先差异点并不多 我们只需要将差异设置为每个状态的特性就好了
我们只是用订单的两个状态举例子 待支付和已到达
我们的UML设计图为


image.png
然后我们去实现代码
public interface Order {
    String orderStataString();
    void  clickOneBtn();
    void  clickTwoBtn();
    void  clickThreeBtn();
}

定义每个状态的不同实现
两个实体类

public class ArrivedOrder implements Order{
    @Override
    public String orderStataString() {
        return "技师已出发";
    }

    @Override
    public void clickOneBtn() {
        System.out.println("联系技师");
    }

    @Override
    public void clickTwoBtn() {
        System.out.println("安全呼叫");
    }

    @Override
    public void clickThreeBtn() {
        System.out.println("技师已出发");
    }
}
package com.example.statetest;

public class NoPayOrder implements Order {
    @Override
    public String orderStataString() {
        return "待支付";
    }

    @Override
    public void clickOneBtn() {
        System.out.println("去支付");
    }

    @Override
    public void clickTwoBtn() {
        System.out.println("取消订单");
    }

    @Override
    public void clickThreeBtn() {

    }
}

使用OrderController定义订单的两个状态 未支付和已到达

public interface OrderController {
    void orderNopay();

    void orderArrived();
}

完成controller实现类

public class OrderControllerImpl implements OrderController, Order {
    Order order;

    public void setOrder(Order order) {
        this.order = order;
    }

    @Override
    public void orderNopay() {
        setOrder(new NoPayOrder());
    }

    @Override
    public void orderArrived() {
        setOrder(new ArrivedOrder());
    }

    @Override
    public String orderStataString() {
        return order.orderStataString();
    }

    @Override
    public void clickOneBtn() {
        order.clickOneBtn();
    }

    @Override
    public void clickTwoBtn() {
        order.clickTwoBtn();
    }

    @Override
    public void clickThreeBtn() {
        order.clickThreeBtn();
    }
}

调用

        OrderControllerImpl orderController = new OrderControllerImpl();
        orderController.orderArrived();
        orderController.clickOneBtn();
        orderController.clickTwoBtn();

这代码的整体结构就完成了 我们只需要不全剩余所需的逻辑就行了
优缺点:
优点:State模式将所有与特定状态的逻辑都放入一个状态对象中,它提供一个更好的方法来组织与特定状态相关的代码,将繁琐的逻辑判断转换为状态类族,在避免代码膨胀的同时,保证了可维护型号与扩展新。
缺点:
增加了系统类和对象 的个数

相关文章

网友评论

    本文标题:android 源码设计模式读书笔记(五)状态模式

    本文链接:https://www.haomeiwen.com/subject/fjyqhctx.html