策略模式(Strategy)

转载 2016年08月30日 23:04:17

策略模式(Strategy)

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

类图:

这里写图片描述
- 1.Strategy:策略接口,用来约束一系列具体的策略算法。Context使用这个接口来调用具体的策略,实现定义的策略。

  • 2.ConcreteStrategy:具体的策略实现,也就是具体的算法实现。

  • 3.Context:上下文,负责与具体的策略交互,通常上下文会持有一个真正的策略实现。

策略模式是把一个类中经常改变或者将来可能改变的部分提取出来作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。

例子

现在我们要根据不同需求,计算两个数的四则运算( + - * /)

//策略定义算法的接口
public interface Strategy {
    int calculate(int num1,int num2);
}
//具体算法,加法
public class OperationAdd implements Strategy {
    @Override
    public int calculate(int num1, int num2) {
        return num1 + num2;
    }
}
//具体算法,减法
public class OperationSubstract implements Strategy {
    @Override
    public int calculate(int num1, int num2) {
        return num1 - num2;
    }
}
//具体算法,乘法
public class OperationMultiply implements Strategy {
    @Override
    public int calculate(int num1, int num2) {
        return num1 * num2;
    }
}
//具体算法,除法
public class OperationDivide implements Strategy {
    @Override
    public int calculate (int num1, int num2){
        int res = 0;
        try {
            res = num1 / num2;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }
}
//上下文
public class Context {
    //持有一个具体策略对象
    private Strategy strategy;

    //传入一个具体策略对象
    public Context(Strategy strategy) {
        this.strategy =strategy;
    }

    public int calculate(int num1,int num2){
        //调用具体策略对象进行算法运算
        return strategy.calculate(num1,num2);
    }
}
 public static void main(String[] args) {
        //计算 1 + 1
        Context context = new Context(new OperationAdd());
        System.out.println("1 + 1 = " + context.calculate(1,1));
        //计算 1 - 1
        context = new Context(new OperationSubstract());
        System.out.println("1 - 1 = " +context.calculate(1,1));
    }

输出结果:

这里写图片描述

总结

策略模式优点:

  • 1.算法可以自由切换。

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

  • 3.扩展性良好。

策略模式缺点:

  • 1.策略类会增多。

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

适用场景:

  • 1.如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

  • 2.一个系统需要动态地在几种算法中选择一种。

  • 3.一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

Test

package com.qbz.test;

//策略接口,计算购车总金额
interface Strategy {
    int calPrice(int price, int num);
}

// 购买5辆及以下不打折
class Nodiscount implements Strategy {
    @Override
    public int calPrice(int price, int num) {
        return price * num;
    }
}

// 购买6-10辆打9.5折
class Disount1 implements Strategy {
    @Override
    public int calPrice(int price, int num) {
        return (int) (price * num * 0.95);
    }
}

// 购买11-20辆打9折算法实现
class Disount2 implements Strategy {

    @Override
    public int calPrice(int price, int num) {
        return (int) (price * num * 0.9);
    }
}

// 购买20辆以上打8.5折算法实现
class Disount3 implements Strategy {

    @Override
    public int calPrice(int price, int num) {
        return (int) (price * num * 0.85);
    }
}

// 上下文,根据不同策略来计算购车总金额
class Context {
    private Strategy strategy;

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

    public int calPrice(int price, int num) {
        // 计算价格算法
        return strategy.calPrice(price, num);
    }
}

public class Main {

    // 每辆车单价10000
    public static void main(String[] args) {
        Strategy strategy;
        // 计算购买3辆总金额
        strategy = new Nodiscount();
        Context context = new Context(strategy);
        System.out.println("购买3辆总金额: " + context.calPrice(10000, 3));
        // 计算12辆总金额
        strategy = new Disount2();
        context = new Context(strategy);
        System.out.println("购买12辆总金额:" + context.calPrice(1000, 12));
    }

}

输出

购买3辆总金额: 30000
购买12辆总金额:10800

浅谈JAVA设计模式之——策略模式(Strategy)

一、概述 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 二、适用性 1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为...
  • l1028386804
  • l1028386804
  • 2015年05月09日 14:02
  • 1892

设计模式--深度解析策略模式(Strategy Pattern)

前些天网购一本Head First Design Patterns,学习了一下,觉得写的挺好,而且挺有趣的,推荐大家都去买一本,真心不错。在这里我先讲一下,这两天学的,两个常见的设计模式,分别Stra...
  • qq_29282475
  • qq_29282475
  • 2015年12月04日 14:17
  • 3556

我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)

每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通...
  • LCL_data
  • LCL_data
  • 2013年08月24日 10:59
  • 12925

C++设计模式<四>:策略模式(Strategy)

1.动机在软件构件过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。2.模式定义定义一系列算法,把它们...
  • MonroeD
  • MonroeD
  • 2016年04月08日 01:16
  • 397

策略模式(Strategy 模式)

一、概述策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。二、结构  策略模...
  • l_lhc
  • l_lhc
  • 2016年02月18日 12:23
  • 403

策略模式(Strategy Pattern)就这么简单

0x00 举个生活中的例子某个大人网站是会员制的,金牌会员购买精神食粮打7折,银牌会员打8折,铜牌会员打9折,铁牌会员不打折。也就是说不同的用户在购买精神食粮的时候结算的价格是不一样的,即使你们买相同...
  • fiendvip
  • fiendvip
  • 2016年04月12日 21:18
  • 4249

设计模式:策略模式(Python)

策略模式(Strategy Pattern): 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 原则: 针对接口(...
  • ericzhong83
  • ericzhong83
  • 2012年05月17日 23:53
  • 4904

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

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

Strategy模式和Template Method模式的异同浅析

一、Strategy模式 1. 特点说明: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。适用场景: 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为...
  • aheroofeast
  • aheroofeast
  • 2011年08月19日 20:16
  • 3102

【java设计模式】之 策略(strategy)模式

策略模式在实际中使用的还是挺多的,先来看一个场景:某个市场人员接到单儿后的报价策略,保价策略很复杂,但是可以简单做如下归类: 新客户小批量报价 新客户大批量报价 老客户小批量报价 ...
  • eson_15
  • eson_15
  • 2016年08月04日 18:20
  • 3698
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:策略模式(Strategy)
举报原因:
原因补充:

(最多只允许输入30个字)