📜  Java状态和策略设计模式的区别(1)

📅  最后修改于: 2023-12-03 15:32:04.046000             🧑  作者: Mango

Java状态和策略设计模式的区别

在 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());
    }
}

在上面的代码中,StartStateStopState 都是状态对象,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 对象即可。

状态模式与策略模式的区别

状态模式和策略模式在某种程度上看起来相似,但它们之间有很大的不同。以下是状态模式和策略模式的主要区别:

  1. 目的不同:状态模式的目的是在不同的状态下执行不同的操作,而策略模式的目的是在不同的场景下使用不同的算法。
  2. 实现不同:状态模式使用内部状态对象来改变对象的行为,而策略模式使用不同的算法来完成不同的行为。
  3. 使用场景不同:状态模式使用在一个对象看起来似乎会因为不同的状态而有不同的行为时,而策略模式使用在当我们需要在不同的场景中使用不同的算法时。

因此,在使用 Java 设计模式时,根据不同的需求和场景来选择合适的设计模式是非常重要的。