策略模式总结

本文详细解析了策略模式和状态模式的概念与应用场景,并通过示例代码对比了两种模式之间的关键区别。策略模式使得算法可以独立于使用它们的实体类,而状态模式则依据实体类的内部状态改变行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

策略模式的定义:定义了算法族,分别封装起来,让他们直接可以相互替换,此模式让算法的变化独立于使用算法的客户。
自己的定义:策略模式使实体类和其应有的行为进行分离,使行为独立,达到多态的目的。                                                                                          伪类图:
与状态模式的区别:
策略模式的接口实现类属于平等关系,处理的业务一致,但是方法不同。
状态模式的接口实现类属于平行关系,处理的业务根据实体类内部状态的变化而变化。
与状态模式的关联(自己总结):
状态模式和策略模式的关联很紧密,使用的时候很容易将状态模式误用为策略模式,我认为,在区分这两个
模式的时候,观察调用他们的主类内部是否有判断状态的条件,如果有,则为状态模式,反之,为策略模式。
举个例子:
首先我们写出一个简单的策略模式:
实体类:
public class Context {


    Method method;

    Context(Method method) {
        this.method = method;
    }

    public void doMethod() {
        method.method();
    }

}

行为接口:
public interface Method {
    public void method();
}

 
 
行为实现类A:
public class StrategyImplA implements Method {

    @Override
    public void method() {
        // TODO Auto-generated method stub
        System.out.println("这是第一个实现");
    }

}

行为实现类B:
public class StrategyImplB implements Method  {

    @Override
    public void method() {
        // TODO Auto-generated method stub
        System.out.println("这是第二个实现");
    }

}

具体调用:
public class X {
    public static void main(String[] args) {
        Context ctx = new Context(new StrategyImplA());
        ctx.doMethod();
        ctx = new Context(new StrategyImplB());
        ctx.doMethod();

}
}

上面的具体调用中,我们就用策略模式实现了Context类的多态(在实体类的不同子类中使用会有更明显的效果)。那么我们在来看看怎么把上面的例子变成状态模式。
我们只需要修改具体调用的X类:
public class X {
    public static void main(String[] args) {
        int i=0;
   Context ctx3 ;
        if(i==0){
       ctx3   = new Context (new StrategyImplA()); 
            ctx3.doMethod();
            i=i+1;
        }
        if(i==1){
                ctx3 = new Context (new StrategyImplB()); 
                ctx3.doMethod();
        }
    }
}

这样子,一个状态模式就完成了,很简单,就是添加了相应的状态判断。
说了这么多,有没有发现什么特性呢?
不管你们有没有发现,反正我是发现了:
使用场景:
状态模式一般是在同一个类中体现出来,比如,在上面的例子中,i的状态为0时,则使用StrategyImplA,为1时,则使用StrategyImplB。而策略模式则是根据不同的子类,调用不同的行为实现去处理不同的行为。
好了,暂时就说这么多,想拍砖的尽情拍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值