什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就状态模式简要概述。
什么是状态模式
状态模式就是类的行为基于其状态变化而改变,属于行为型模式。
应用场景
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
商店售出物品:衣服一套
额外赠送香蕉二斤
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154677.html