「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
含义: 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。这是说的啥,好像又模糊了,对象的行为跟随状态的改变而改变,好像对象重新初始化了一个类。就是将代码中与对象有关的内容抽象出来。
拿无人超市举例子吧
public class SelfServiceSupermarket
{
//扫码
private final static int CODE = 0;
//未扫码
private final static int NO_CODE = 0;
//售出商品
private final static int SOLD = 1;
//无商品
private final static int SELLOUT = 2;
private int commodityStatus = NO_CODE;
//数量
private int count = 0;
public SelfServiceSupermarket(int count)
{
this.count = count;
if (count > 0)
{
commodityStatus = NO_MONEY;
}
}
/**
* 投入硬币,任何状态用户都可能投币
*/
public void insertMoney()
{
switch (commodityStatus)
{
case NO_CODE:
commodityStatus = CODE;
System.out.println("成功扫码");
break;
case CODE:
System.out.println("已经扫过码");
break;
case SOLD:
System.out.println("请稍等...");
break;
case SELLOUT:
System.out.println("此商品已经下架,请勿购买");
break;
}
}
//支付
public void pay()
{
switch (commodityStatus)
{
case NO_CODE:
System.out.println("无商品");
break;
case CODE:
System.out.println("支付成功");
commodityStatus = SOLD;
dispense();
break;
case SOLD:
System.out.println("已经支付");
break;
case SOLD_OUT:
System.out.println("此商品已经下架,请勿购买");
break;
}
}
主要是为了解决依赖于对象的状态(属性)的行为,并且能够根据自身行为状态的改变,从而改变它的相关行为。
优点: 1、封装了转换规则。 2、将与某个状态有关的所有行为集中在一个类中,并能够很方便的添加状态。3、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、能够让不同的对象共同使用同一个状态对象,可以减少对象的个数。
缺点: 1、状态模式的结构与实现都非常的复杂,使用时要特别注意,不然会使代码变得非常混乱,不易维护。 3、不是很满足“开闭原则”。