策略模式与状态模式

策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替代,此模式让算法发生变化,不会影响到使用算法的客户。
我们继续来打去学校的例子。先看代码。
定义一个策略接口:

public interface ToSchoolStrategy {
    public void toSchool();
}

策略实现:

public class ExceptionalStrategy implements ToSchoolStrategy {

    @Override
    public void toSchool() {
        System.out.println("父母送");
    }

}
public class GenerallyStrategy implements ToSchoolStrategy {
    @Override
    public void toSchool() {
        System.out.println("坐校车");
    }

}

定义一个学生。

public class Student {

    public void toSchool(ToSchoolStrategy to){
        to.toSchool();
    }

    public void goHome(ToSchoolStrategy to){
        to.toSchool();
    }

}

client

    public static void main(String[] args) {
        ToSchoolStrategy to = new GenerallyStrategy();
        ToSchoolStrategy to1 = new ExceptionalStrategy();
        Student studentA = new Student();
        System.out.println("A同学");
        studentA.toSchool(to);
        studentA.goHome(to1);

        Student studentB = new Student();
        System.out.println("B同学");
        studentB.toSchool(to);
        studentB.goHome(to);
    }

那么学生想去学校想回家就可以调用不同的策略来实现他的去学校功能。去学校的策略就是我们封装起来的算法
,我们无论怎么替换去学校的策略。都不会影响我们同学学习。简单来说就是这样子。
我们这么看其实挺好理解的,但是当你看到状态模式的时候你就会怀疑这两者有差别么?

我们先看一下状态模式的代码把。我们可以保留策略模式的两种去学校策略只改变我们的学生类。

public class Student {
    private ToSchoolStrategy to = new GenerallyStudent();
    public void setHealthIndex(int healthIndex){        
        if(healthIndex>50)
            to = new GenerallyStudent();
        else
            to = new Exceptionalstudent();
    }

    public void toSchool(){
        to.toSchool();
    }
    public void goHome(){
        to.toSchool();
    }
}

client

    public static void main(String[] args) {
        Student studentA = new Student();
        studentA.toSchool();
        studentA.setHealthIndex(45);//腿部受伤
        studentA.goHome();
    }

是不是感觉这两不就是一个东西么?
状态模式:当一个对象的内在 状态改变时,允许改变其行为,这个对象像是改变了其类。

但是策略模式是围绕可以互换的算法来创建成功业务的,然而状态模式是通过改变对象内部的状态来帮助对象控制自己行为的。前者行为是彼此独立、可以相互替换的,后者行为是不可以相互替换的。

也就是说腿部首相身体健康指标下降。然后必须家长来接,而策略模式主要表达去学校的两种形式,无论用那种都可以达到去学校回家的目的。而状态模式是某种状态需要怎么去学校,当你腿部受伤时,你必须让你们接,因此是不可替代的。

策略模式状态模式在设计上的区别主要体现在它们的目的、行为触发机制以及对象之间的关系上。 - **目的**:策略模式旨在封装不同的算法,允许客户端在运行时选择不同的实现。这种模式特别适用于需要动态改变算法的情况,例如支付方式的选择或者排序算法的切换。相反,状态模式关注的是对象的状态变化对行为的影响。它通过封装不同状态下的行为来简化复杂的条件逻辑[^2]。 - **行为触发机制**:在策略模式中,行为的改变通常是由外部调用者显式地设置新的策略来触发的;而在状态模式中,行为的变化是由于内部状态的自动转换引起的。比如,在订单处理过程中,当一个步骤完成时,系统会自动进入下一个状态,而不需要用户干预[^1]。 - **状态/策略关系**:策略模式中的各个策略通常是独立且互不相关的,每个策略都提供了相同功能的不同实现。而状态模式中的状态之间可能存在关联,并且可能定义了状态之间的转移规则,这使得状态模式更适合用来建模那些具有自然流程的状态变化场景。 - **典型应用**:策略模式常用于像折扣策略、支付方式这样的场景,其中不同的业务规则可以被封装成不同的策略类。状态模式则更适用于表示如订单状态、游戏角色状态或线程状态等需要跟踪并响应状态变化的对象。 综上所述,虽然这两种模式都可以帮助我们遵循开放封闭原则(OCP),即对于扩展是开放的,而对于修改则是关闭的,但是它们解决的问题域有所不同。策略模式强调的是算法的选择和替换,而状态模式强调的是基于当前状态的行为变化。 ```java // 策略模式示例 - 定义一个接口 public interface Strategy { int doOperation(int num1, int num2); } // 具体策略A public class OperationAdd implements Strategy { @Override 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); } } ``` ```java // 状态模式示例 - 定义状态接口 public interface State { void handle(); } // 具体状态A public class ConcreteStateA implements State { @Override public void handle() { // 实现具体的行为 } } // 环境类持有状态 public class Context { private State state; public void setState(State state) { this.state = state; } public void request() { state.handle(); } } ``` 这些例子展示了如何利用策略模式状态模式来创建灵活的设计,但请根据实际需求调整代码以适应特定的应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值