设计模式12——策略模式

 一、策略模式的定义 

Define a family of algorithms,encapsulate each one,and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)

二、策略模式的应用

1、策略模式的优点

1.算法可以自由切换

这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供”可自由切换”的策略。

2.避免使用多重条件判断

如果没有策略模式,我们想想看会是什么样子?
一个策略家族有5个策略算法,一会要使用A策略,一会要使用B策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。

3.扩展性良好

只要实现接口就可以,其他都不用修改,类似于一个可反复拆卸的插件,大大符合OCP原则(开闭原则)。

2、策略模式的缺点 

1.策略类数量增多

每个策略都是一个类,复用的可能性很小,类的数量增多

2.所有的策略类都需要对外暴露

上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,这与迪米特法则相违背的,我只想使用一个策略,我凭什么就要了解这个策略呢?那要你的封装类还有什么意义?这是原装策略模式的一个缺点,幸运的是,我们可以使用其他模式来修正这个缺陷,如工厂方法模式、代理模式或享元模式。

3、策略模式的使用场景

1.多个类只有在算法或行为上稍有不同的场景。

2.算法需要自由切换的场景。

例如,算法的选择是由使用者决定的,或者是算法始终在进化,特别是一些站在技术前沿的行业,连业务专家都无法给你保证这样的系统规则能够存在多长时间,在这种情况下策略模式是你最好的助手。

3.需要屏蔽算法规则的场景。

现在的科技发展得很快,人脑记忆是有限得,太多得算法你只要知道一个名字就可以了,传递相关得数字进来,反馈一个运算结果,就Ok了。

三、策略模式的实现

public interface Strategy {

    //策略模式的运算法则
    public void doSomething();
}


public class ConcreteStrategy1 implements Strategy {
    public void doSomething() {
        System.out.println("具体策略1的运算法则");
    }
}

public class ConcreteStrategy2 implements Strategy {
    public void doSomething() {
        System.out.println("具体策略2的运算法则");
    }
}

public class Context {

    //抽象策略
    private Strategy strategy = null;

    //构造函数设置具体策略
    public Context(Strategy _strategy) {
        this.strategy = _strategy;
    }

    //封装后的策略方法
    public void doAnything() {
        this.strategy.doSomething();
    }

}
public class Client {

    public static void main(String[] args) {
        //声明一个具体的策略
        Strategy strategy = new ConcreteStrategy1();

        //声明上下文对象
        Context context = new Context(strategy);

        //执行封装后的方法
        context.doAnything();
    }
}

四、策略模式在源码中的应用

经常使用动画的人应该都使用过插值器,对于想要控制动画的速度,让它加速或者减速运动,就可以通过插值器实现。对于插值器 就是策略模式的典型应用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值