定义:当一个状态改变是允许改变其行为,这个对象看起来像改变了其类。
使用场景:(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模式将所有与特定状态的逻辑都放入一个状态对象中,它提供一个更好的方法来组织与特定状态相关的代码,将繁琐的逻辑判断转换为状态类族,在避免代码膨胀的同时,保证了可维护型号与扩展新。
缺点:
增加了系统类和对象 的个数
网友评论