设计模式之状态模式

发布于:2022-11-28 ⋅ 阅读:(148) ⋅ 点赞:(0)

什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就状态模式简要概述。

什么是状态模式
状态模式就是类的行为基于其状态变化而改变,属于行为型模式。

应用场景
1、大量与对象状态判断的业务的场景

优势与劣势
优点:
1、将对象状态判断抽象出来代码灵活性提高,增加或者删除状态不影响其他代码
2、上下文不参与具体判断逻辑由抽象实现类自动进行行为转换

缺点:
1、每个对象状态都需要实现抽象类,增加代码复杂性与可读性
2、影响开闭原则

小试牛刀

  • 对象的行为由状态改变而改变
  • 商机出售货物有很多,每种商品都能够获得积分
  • 在购物达到指定标准的时候,顾客可以获取其他的一些特权,比如我们例子中的赠送物品
  • 这个就是典型的对象的行为根据对象的状态改变而变化

类的依赖关系为:
在这里插入图片描述

1、创建一个商店并声明积分状态integral

/**
 * 商店
 * @author senfel
 * @version 1.0
 * @date 2022/10/8 10:26
 */
public class Store {

    /**
     * 购物积分
     */
    private BigDecimal integral;
    /**
     * 购物属性
     */
    private Shopping shopping;

    public Shopping getShopping() {
        return shopping;
    }

    public void setShopping(Shopping shopping) {
        this.shopping = shopping;
    }

    public BigDecimal getIntegral() {
        return integral;
    }

    public void setIntegral(BigDecimal integral) {
        this.integral = integral;
    }

    /**
     * 售出的物品
     * 由于购物积分改变使得顾客可以获得其他附属产品
     * 如果购物积分大于20 赠送香蕉二斤
     * 如果购物积分大于100 赠送芒果二斤
     * 这个就是改变状态影响行为的例子
     *
     */
    public void buySomething(){
        System.err.println("商店售出物品:"+shopping.getDesc());
        if(integral.compareTo(new BigDecimal("100")) >= 0){
            System.err.println("额外赠送芒果二斤");
        }else if(integral.compareTo(new BigDecimal("20")) >= 0){
            System.err.println("额外赠送香蕉二斤");
        }else{
            System.err.println("购物积分不足,无赠送福利");
        }
    }
}

2、创建购物抽象,增加顾客购物修改商店状态抽象方法

/**
 * 购物抽象
 * @author senfel
 * @version 1.0
 * @date 2022/10/8 10:27
 */
public abstract class Shopping {

    /**
     * 购物备注
     */
    private String desc;

    /**
     * 购物抽象方法
     */
    abstract void buy(Store store);

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

3、增加两个实体购物类

/**
 * 购买衣服
 * @author senfel
 * @version 1.0
 * @date 2022/10/8 10:29
 */
public class BuyCloth extends Shopping{

    @Override
    public void buy(Store store) {
        System.err.println("顾客购买衣服一套");
        if(Objects.isNull(store.getIntegral())){
            store.setIntegral(BigDecimal.ZERO);
        }
        store.setIntegral(store.getIntegral().add(new BigDecimal("20")));
        this.setDesc("衣服一套");
        store.setShopping(this);
    }
}
/**
 * 购买水果
 * @author senfel
 * @version 1.0
 * @date 2022/10/8 10:29
 */
public class BuyFruit extends Shopping{

    @Override
    public void buy(Store store) {
        System.err.println("顾客购买水果一斤");
        if(Objects.isNull(store.getIntegral())){
            store.setIntegral(BigDecimal.ZERO);
        }
        store.setIntegral(store.getIntegral().add(new BigDecimal("5")));
        this.setDesc("水果一斤");
        store.setShopping(this);
    }
}

4、测试状态模式,顾客购买物品修改商店状态,商店根据修改的状态实现具体的卖货行为。

/**
 * 状态模式测试
 * @author senfel
 * @version 1.0
 * @date 2022/10/8 10:39
 */
@SpringBootTest
public class TestStatePattern {

    /**
     * 对象的行为由状态改变而改变
     * 商机出售货物有很多,每种商品都能够获得积分
     * 在购物达到指定标准的时候,顾客可以获取其他的一些特权,比如我们例子中的赠送物品
     * 这个就是典型的对象的行为根据对象的状态改变而变化
     */
    @Test
    public void test(){
        //创建一个商店
        Store store = new Store();
        //客户购买水果,购买会改变商店的积分状态
        BuyFruit buyFruit = new BuyFruit();
        buyFruit.buy(store);
        System.err.println("当前积分:"+store.getIntegral());
        //商店的行为根据状态改变而改变
        store.buySomething();
        //客户购买衣服,购买会改变商店的积分状态
        BuyCloth buyCloth = new BuyCloth();
        buyCloth.buy(store);
        System.err.println("当前积分:"+store.getIntegral());
        //商店的行为根据积分状态改变而改变
        store.buySomething();
    }
}

5、测试结果:

顾客购买水果一斤
当前积分:5
商店售出物品:水果一斤
购物积分不足,无赠送福利
顾客购买衣服一套
当前积分:25
商店售出物品:衣服一套
额外赠送香蕉二斤

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到