📅  最后修改于: 2023-12-03 15:32:04.046000             🧑  作者: Mango
在 Java 设计模式中,状态模式和策略模式是两个常用的行为型设计模式。虽然它们在某种程度上看起来相似,但其实它们之间有很大的不同。在本文中,我们将探讨 Java 状态模式和策略模式的区别。
在状态模式中,一个对象的状态是通过在对象内部维护一个状态对象而改变的。当一个对象的状态发生改变时,其行为也会随之改变。状态模式使用在当一个对象看起来似乎会因为不同的状态而有不同的行为时。
状态模式的核心概念是状态转换:
以下是一个状态模式的例子:
public interface State {
public void doAction(Context context);
}
public class StartState implements State {
public void doAction(Context context) {
System.out.println("Player is in start state");
context.setState(this);
}
}
public class StopState implements State {
public void doAction(Context context) {
System.out.println("Player is in stop state");
context.setState(this);
}
}
public class Context {
private State state;
public Context() {
state = null;
}
public void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
}
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context();
StartState startState = new StartState();
startState.doAction(context);
System.out.println(context.getState().toString());
StopState stopState = new StopState();
stopState.doAction(context);
System.out.println(context.getState().toString());
}
}
在上面的代码中,StartState
和 StopState
都是状态对象,Context
对象中维护了一个状态对象。当状态发生改变时,对象会从一个状态转变到另一个状态。
在策略模式中,我们使用接口或抽象类定义一组算法,每一种算法都可以单独进行替换。策略模式使用在当我们需要在不同的场景中使用不同的算法时。
策略模式的核心概念是算法簇:
以下是一个策略模式的例子:
public interface Strategy {
public int doOperation(int num1, int num2);
}
public class OperationAdd implements Strategy {
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
public class OperationSubtract implements Strategy {
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
public class OperationMultiply implements Strategy {
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
在上面的代码中,我们通过使用不同的策略来完成不同的算法。Context
对象中维护了一个策略对象,当我们需要执行不同的算法时,我们只需要把不同的策略传递给 Context
对象即可。
状态模式和策略模式在某种程度上看起来相似,但它们之间有很大的不同。以下是状态模式和策略模式的主要区别:
因此,在使用 Java 设计模式时,根据不同的需求和场景来选择合适的设计模式是非常重要的。