前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >策略模式

策略模式

作者头像
提莫队长
发布2019-02-21 16:24:58
4560
发布2019-02-21 16:24:58
举报
文章被收录于专栏:刘晓杰刘晓杰

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

策略模式:

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

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

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

举例

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

代码语言:javascript
复制
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");
    }
}

另外定义一个环境类

代码语言:javascript
复制
class Person {
    private Solution solution;

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

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

最终如下调用

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年02月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 策略模式:
  • 举例
  • 总结与分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档