策略模式

在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。

策略模式:

定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也称为政策模式(Policy)。

策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想。

当存在以下情况时使用Strategy模式
1)许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。
2)需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。
3)算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4)一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

举例

外出游玩的时候所选择的交通工具

public interface Solution {
    public void travel();
}

public class BikeSolution implements Solution {
    @Override
    public void travel() {
        System.out.println("BikeSolution");
    }
}

public class CarSolution implements Solution {
    @Override
    public void travel() {
        System.out.println("CarSolution");
    }
}

另外定义一个环境类

class Person {
    private Solution solution;

    public void setSolution(Solution s){
        solution = s;
    }

    public void travelSolution(){
        solution.travel();
    }
}

最终如下调用

class StrategySolution {

    public static void main(String[] args) {
        Person person = new Person();
        person.setSolution(new BikeSolution());
        person.travelSolution();

        person.setSolution(new CarSolution());
        person.travelSolution();
    }
}

总结与分析

1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。
2)在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。
3)策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。

优点:
1.结构清晰明了、使用简单直观。
2.耦合度相对而言较低,扩展方便。
3.操作封装也更为彻底,数据更为安全。
缺点:
1.随着策略的增加,子类也会变得繁多。

参考
http://blog.csdn.net/hguisu/article/details/7558249/
http://blog.csdn.net/jason0539/article/details/45007553
http://blog.csdn.net/xu__cg/article/details/53155551

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值