状态模式和策略模式都是常用的设计模式,但是它们的应用场景不同。状态模式主要用于处理对象在内部状态改变时,改变其行为的场景。而策略模式则实现了算法定义和算法使用的分离,它通过继承和多态的机制实现对算法族的使用和管理。
在软件开发中,我们经常会遇到一些复杂的问题,例如在一个系统中,一个对象的状态可能会随着另一个对象的行为而改变,这种情况下,我们可以使用状态模式来解决问题,状态模式是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为,这种模式的主要目的是将对象的状态封装在一个类中,从而使状态的改变和行为的改变相互独立。
状态模式的核心思想是将对象的状态与其行为分离,使得状态可以在不同的对象之间共享,而行为可以独立于状态变化,这种模式的主要优点是可以提高代码的可读性和可维护性,同时也可以减少代码的复杂性。
状态模式的基本组成部分包括以下几个部分:
1、抽象状态类(Abstract State):这是一个接口,定义了所有可能的状态以及与之相关的行为,所有的具体状态类都应该实现这个接口。
2、具体状态类(Concrete State):这是实现了抽象状态类的具体状态类,每个具体状态类都代表了一个具体的状态,并提供了与该状态相关的行为。
3、上下文类(Context):这是一个包含了当前对象的状态的对象,它也是状态模式的客户端,上下文类持有一个抽象状态类的引用,并通过这个引用来改变其状态。
4、状态监听者(State Listener):这是一个接口,定义了所有可能的状态监听器及其相应的操作,所有的具体状态监听器都应该实现这个接口。
5、主题(Subject):这是一个包含了多个具体状态类的对象,它也是状态模式的客户端,主题类持有一个上下文对象的引用,并通过这个引用来获取当前的状态和触发相应的行为。
下面是一个简单的状态模式的例子:
假设我们有一个在线购物系统,其中有三种商品:书、衣服和电子产品,每种商品都有自己的价格属性,并且每种商品都有自己的库存信息,我们需要根据用户选择的商品类型来显示相应的价格和库存信息,为了实现这个功能,我们可以使用状态模式。
我们定义一个抽象状态类 BookState:
public abstract class BookState { public abstract void setPrice(double price); public abstract void setStock(int stock); }
我们定义两个具体状态类 NormalBookState 和 DiscountedBookState:
public class NormalBookState extends BookState { private double price; private int stock; @Override public void setPrice(double price) { this.price = price; } @Override public void setStock(int stock) { this.stock = stock; } } public class DiscountedBookState extends BookState { private double price; private int stock; @Override public void setPrice(double price) { this.price = price; } @Override public void setStock(int stock) { this.stock = stock; } }
我们定义一个上下文类 ShoppingCart:
public class ShoppingCart implements Context { private BookState currentState; private double price; private int stock; @Override public void setCurrentState(BookState state) { this.currentState = state; } @Override public void show() throws Exception { currentState.setPrice(price); currentState.setStock(stock); System.out.println("当前商品价格:" + price); System.out.println("当前商品库存:" + stock); } }
我们定义一个主题类 Customer:
public class Customer implements Subject { private ShoppingCart cart; Context context; // 这里省略了构造函数和其他方法的实现细节... Object[] items; // 这里省略了构造函数和其他方法的实现细节... int index = 0; // 这里省略了构造函数和其他方法的实现细节... Item[] bookItems; // 这里省略了构造函数和其他方法的实现细节... Item[] clothingItems; // 这里省略了构造函数和其他方法的实现细节...