Java设计模式----------策略模式

标签: Java 设计模式 策略模式 
2人阅读 评论(0) 收藏 举报
分类:

1、介绍

策略模式的思想是提取算法或者行为,对算法或者策略进行封装成类,并装配到一个环境类(context)上,使得环境类可以使用不同的算法或者策略来解决不同的问题。策略模式是一种行为型设计模式。

这种设计模式解决的是硬编码场景中的算法扩展问题。针对某一个场景,可能存在多个算法来进行处理。这多个算法,可能是写在一个工具类的不同的方法中,也有可能是写在一个方法中根据不同的条件进行if-else的选择。但是这样的处理方式的扩展性非常差劲,如果要增加一种算法,就需要修改工具类。要增加代码的扩展性,就需要为每个算法新建一个类,其中放置算法逻辑。这样当新增算法的时候,只需要增加对应的算法类即可,这就是策略模式的主要内容。

实现:策略模式中一般存在如下几个角色:

  • 抽象策略接口:定义策略类的通用接口,是策略或者算法的调用入口。
  • 具体策略类:策略实现类,根据业务场景包含某一种算法的真实执行逻辑。具体策略类用于装配环境类,从而让环境类能够有能力进行不同的处理逻辑。
  • 环境类(context):依赖抽象策略接口,使用具体策略类装备自己。客户端根据具体场景,选择对应的具体策略类来装配环境类,为环境类赋能。环境类只负责处理具体场景下的问题。具体策略类的选择是客户端进行的,环境类不提供该能力。

使用场景:系统中存在多种可供选择的策略或者算法,针对各种不同的场景,需要提取出一种算法或者策略进行处理的时候,可以选择策略模式。

  • 比如某些银行卡会推出普通会员卡,银卡,金卡和钻石卡。每种银行卡在购物时候享受的优惠是不同的,在计算优惠的时候,就存在了不同的策略和算法,比如会员卡9折,银卡8折,金卡7折和钻石卡6折,这样就存在了4中算法。当购物的时候,需要顾客的会员卡等级,选择出对应的策略来进行总价计算。
  • 比如出去玩,可以步行,骑自行车,开车,打车。那么就需要从这么多的策略中选出一种来。比如为了锻炼身体,选择了步行。但是某人提出要赶时间,那就改为用打车的策略来装配决策类,改为打车的方式出行。

2、案例

2.1、背景

以假期出行为例,总是存在多种出行策略的选择。去浪漫的土耳其,去东京和巴黎,还特别喜欢迈阿密,有黑人的洛杉矶。假期有限,只能选择其中的一种。那么就跟小伙伴开始商量(context类),小伙伴A说土耳其比较便宜,毕竟经费有限。OK,那就决定去土耳其了。然后小伙伴B说,他家里有亲戚在东京,包吃包住。OK,那就取东京把。最后小伙伴C说了,他想去迈阿密,让大家跟他一起,所有经费他包了。OK,那就去迈阿密把。

图片描述

2.2、实现

抽象策略接口

public interface Strategy
{
    void go();
}

具体策略类

public class TurkeyVocation implements Strategy
{
    @Override
    public void go()
    {
        System.out.println("去土耳其。");
    }
}
public class TokyoVocation implements Strategy
{
    @Override
    public void go()
    {
        System.out.println("去东京。");
    }
}
public class MiamiVocation implements Strategy
{
    @Override
    public void go()
    {
        System.out.println("去迈阿密拉。");
    }
}

环境类

public class Context
{
    private Strategy strategy;

    public Context(Strategy strategy)
    {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy)
    {
        this.strategy = strategy;
    }

    public void action()
    {
        this.strategy.go();
    }
}

验证程序

/**
 * 验证
 */
public class Demo
{
    public static void main(String[] args)
    {
        System.out.println("小伙伴A:土耳其比较便宜,毕竟经费有限");
        Strategy strategy = new TurkeyVocation();
        Context context = new Context(strategy);
        context.action();

        System.out.println("小伙伴B:家里有亲戚在东京,包吃包住");
        strategy = new TokyoVocation();
        context.setStrategy(strategy);
        context.action();

        System.out.println("小伙伴C:所有经费我包了");
        strategy = new MiamiVocation();
        context.setStrategy(strategy);
        context.action();
    }
}

运行结果

小伙伴A:土耳其比较便宜,毕竟经费有限
去土耳其。
小伙伴B:家里有亲戚在东京,包吃包住
去东京。
小伙伴C:所有经费我包了
去迈阿密拉。

Process finished with exit code 0

3、总结

核心思想就是将算法或者策略封装成类。

优点:各种算法可以自由切换,具有非常好的扩展性。

缺点:每一种策略都需要封装成一个类,可能会存在较多的策略类。

查看评论

Java设计模式——Comparable接口&&Comparator(CC系)策略模式的应用

Comparable接口&&Comparator接口:突然想起了民国时期的CC系,哈哈^_^ 转自:http://www.cnblogs.com/baizhanshi/p/6201875.html ...
  • scliu12345
  • scliu12345
  • 2017-03-04 17:17:52
  • 464

Java设计模式——策略模式实现及原理

简介 定义 策略模式:将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。并使他们可以相互替换,从而导致客户端程序独立于算法的改变。 策略模式中的设计原则:变化的抽象成接口;面向...
  • Goskalrie
  • Goskalrie
  • 2016-09-08 16:22:11
  • 3361

大话设计模式—策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。大话设计模式中程杰老师给出的定义是这样的:策略模式(Strategy),定义了...
  • lmb55
  • lmb55
  • 2016-03-23 23:59:47
  • 2125

Java设计模式——策略模式(Strategy Pattern)

Java设计模式——策略模式(Strategy Pattern) 场景一 描述:刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,...
  • u012401711
  • u012401711
  • 2016-09-07 21:16:14
  • 1670

Head First 设计模式学习笔记 ——策略模式

Head First 设计模式学习 ——策略模式简单理解     问题来源:     在子类继承父类时,如果子类不需要使用父类中的某些方法,该如何处理?     举个例子,如下图所示,父类Duck类抽...
  • u010429424
  • u010429424
  • 2016-07-27 19:22:41
  • 538

java设计模式之策略模式及项目中的应用

今天开始,我们LazyCoder准备着手开发一款模拟人生游戏,首先从设计人物开始,我们设想我们设计的人物可以讲话,吃东西,睡觉,他们的样子也都不一样。我们想到了继承,于是有了第一个类Person,之后...
  • zcm101
  • zcm101
  • 2013-07-17 17:00:34
  • 2608

策略模式-商场促销-大话设计模式

类结构://父类,商场结账的算法 public interface SuperCash { //得到算过后的结账金额 public double getcash(double cash); }//...
  • wxwzy738
  • wxwzy738
  • 2012-05-31 19:43:18
  • 2148

重构:switch语句改成策略模式还是状态模式

在重构篇里,可以用多态来取代switch语句,但是因为:一部影片可以在生命周期内修改自己的分类,一个对象却不能在生命周期内修改自己所属的类。所以这里不能用策略模式,用多态取代switch,而应该用状态...
  • qq_21381465
  • qq_21381465
  • 2016-05-02 22:32:23
  • 2307

java 设计模式 策略模式,comparable 接口,compareTo 方法

重点在于判断 对象   谁大谁小 尤其是比较类对象的 “谁大谁小” 打印类对象 print(a) 必须在类里要重写 toString() 方法 @Override public Str...
  • yuyi_000
  • yuyi_000
  • 2015-07-20 22:16:20
  • 517

java设计模式之行为型模式-策略模式

策略设计模式 策略模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 ...
  • u011726984
  • u011726984
  • 2016-04-30 19:51:06
  • 782
    个人资料
    持之以恒
    等级:
    访问量: 686
    积分: 511
    排名: 9万+
    文章存档