- 状态模式与策略模式
- 结合场景:在电商订单系统中,订单有不同的状态(如待支付、已支付、已发货等),同时对于不同状态下的订单处理逻辑,可能有多种策略。例如,待支付订单可以有不同的支付策略(支付宝支付、微信支付等)。
- 解决问题:通过结合状态模式和策略模式,可以在不同订单状态下灵活切换支付策略,使系统更具可维护性和扩展性。
- 优势:将订单状态管理和支付策略管理分离,降低代码耦合度,便于新增订单状态或支付策略。
- 代码示例:
// 策略接口
interface PaymentStrategy {
void pay(double amount);
}
// 具体策略类
class AlipayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("使用支付宝支付:" + amount + "元");
}
}
class WeChatPayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("使用微信支付:" + amount + "元");
}
}
// 状态接口
interface OrderState {
void handle(Order order);
}
// 具体状态类 - 待支付状态
class PendingPaymentState implements OrderState {
private PaymentStrategy paymentStrategy;
public PendingPaymentState(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
@Override
public void handle(Order order) {
System.out.println("订单处于待支付状态");
paymentStrategy.pay(order.getAmount());
}
}
// 订单类
class Order {
private double amount;
private OrderState state;
public Order(double amount) {
this.amount = amount;
this.state = new PendingPaymentState(new AlipayStrategy());
}
public void setState(OrderState state) {
this.state = state;
}
public double getAmount() {
return amount;
}
public void handle() {
state.handle(this);
}
}
// 测试代码
public class Main {
public static void main(String[] args) {
Order order = new Order(100);
order.handle();
order.setState(new PendingPaymentState(new WeChatPayStrategy()));
order.handle();
}
}
- 状态模式与工厂模式
- 结合场景:在游戏角色状态管理系统中,角色有多种状态(如正常、中毒、隐身等),每种状态有不同的行为。可以使用工厂模式来创建不同的状态对象。
- 解决问题:简化状态对象的创建过程,提高代码的可维护性和复用性。当需要新增状态时,只需在工厂类中添加创建逻辑。
- 优势:将状态对象的创建和使用分离,使得代码结构更清晰,便于集中管理状态对象的创建。
- 代码示例:
// 状态接口
interface CharacterState {
void action();
}
// 具体状态类 - 正常状态
class NormalState implements CharacterState {
@Override
public void action() {
System.out.println("角色处于正常状态,正常行动");
}
}
// 具体状态类 - 中毒状态
class PoisonedState implements CharacterState {
@Override
public void action() {
System.out.println("角色中毒,持续掉血");
}
}
// 状态工厂类
class StateFactory {
public static CharacterState getState(String stateType) {
if ("normal".equals(stateType)) {
return new NormalState();
} else if ("poisoned".equals(stateType)) {
return new PoisonedState();
}
return null;
}
}
// 角色类
class Character {
private CharacterState state;
public Character() {
this.state = StateFactory.getState("normal");
}
public void setState(CharacterState state) {
this.state = state;
}
public void performAction() {
state.action();
}
}
// 测试代码
public class Main {
public static void main(String[] args) {
Character character = new Character();
character.performAction();
character.setState(StateFactory.getState("poisoned"));
character.performAction();
}
}