一、什么是策略模式

  Strategy模式也叫策略模式是行为模式之一, 它对一系列的算法加以封装,为所有算法定义一 个抽象的算法接口,并通过继承该抽象算法接口 对所有的算法加以封装和实现,具体的算法选择 交由客户端决定(策略)。Strategy模式主要用 来平滑地处理算法的切换 。

二、策略模式的结构

三、策略模式的角色和职责

  Strategy: 策略(算法)抽象。

  ConcreteStrategy    各种策略(算法)的具体实现。

  Context    策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。

四、策略模式的优点

  它的优点有:

    1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定 义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类 里面,从而避免重复的代码。

    2. 策略模式提供了可以替换继承关系的办法。继承可以处理多种算 法或行为。如果不是用策略模式,那么使用算法或行为的环境类就 可能会有一些子类,每一个子类提供一个不同的算法或行为。但 是,这样一来算法或行为的使用者就和算法或行为本身混在一起。 决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻 辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或 行为变得不可能。

     3. 使用策略模式可以避免使用多重条件转移语句。多重转移语句不 易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行 为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办 法还要原始和落后。

五、策略模式的缺点

  策略模式的缺点有:

     1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

    2. 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

没用策略模式

策略类

 //策略
public interface Strategy { //加密
public void encrypt();
}

Md5策略

 //Md5策略
public class MD5Strategy implements Strategy{ public void encrypt() {
System.out.println("执行MD5加密");
} }

Mds策略

 //MDS策略
public class MDSStrategy implements Strategy{ public void encrypt() {
System.out.println("执行MDS加密");
}
}

上下文类

 //上下文
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
} public void encrypt() {
this.strategy.encrypt();
}
}

测试

 public class MainClass {
public static void main(String[] args) {
// Strategy stra = new MDSStrategy();
// stra.encrypt();
Context context = new Context(new MDSStrategy());
context.encrypt();
}
}

=============================================================================

上下文

 //上下文
public class Context {
private Strategy strategy; public Context(Strategy strategy) {
this.strategy = strategy;
} public double cost(double num){
return this.strategy.cost(num);
}
}

策略接口

 //策略接口
public interface Strategy { public double cost(double num);
}

策略A

 public class StrategyA implements Strategy{

     public double cost(double num) {
return num * 0.8;
}
}

策略B

 public class StrategyB implements Strategy {

     public double cost(double num) {
if(num >= 200) {
return num - 50;
}
return num;
}
}

测试

 public class MainClass {
public static void main(String[] args) {
double num = 200;
Context context = new Context(new StrategyB());
double newNum = context.cost(num);
System.out.println("实际付账" + newNum + "元");
}
}

08策略模式Strategy的更多相关文章

  1. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  2. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  3. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  4. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  5. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

  6. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  7. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  8. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

  9. 策略模式-Strategy(Java实现)

    策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...

随机推荐

  1. javascript中的LHS与RHS

    最近在学习javascript过程中,接触了LHS与RHS的概念,刚开始的时候有点理解不清,现在做一些梳理,方便以后进行理解. LHS与RHS:javascript引擎的两种查找类型,含义是赋值操作的 ...

  2. Qt 4.6.2静态编译

    一.下载mingw 4.4.0:ftp://ftp.trolltech.com/misc/MinGW-gcc440_1.zip 二.解压到C:\mingw目录下,设置环境变量path将C:\mingw ...

  3. Chrome上网问题解决记录

    浏览器打开网站缓慢,甚至等待很久后直接烂页面 注意观察浏览器左下角会显示: 正在建立安全连接... 环境: 操作系统:Win10 Chrome版本: 69.x 解决办法:http://bbs.360. ...

  4. Java之String、StringBuilder、StringBuffer的区别

    String : 字符串常量,它们的值在创建之后不能更改.代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. String的值是不可变的,这就 ...

  5. 让你提升命令行效率的 Bash 快捷键 [完整版]

    转自:http://linuxtoy.org/archives/bash-shortcuts.html 生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率. 大部分对其他 ...

  6. poj--1088--DFS(记忆化搜索之经典)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 68057   Accepted: 25039 Description ...

  7. SharePoint 2019 图文安装教程

    前言 SharePoint 2019刚刚发布,很多群友在寻找安装教程,霖雨正好也下载了进行体验,就把完整的安装过程做成图文教程,分享给大家了,有需要的人可以有个参考. 文章从创建虚拟机开始,可能有点啰 ...

  8. 奇怪吸引子---Hadley

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  9. Redis 常用监控信息命令总结

    查看启动到当前处理命令总数: # redis-cli info stats | grep total_commands total_commands_processed:23693286991 查看每 ...

  10. hihocoder第238周:杨氏矩阵的个数

    题目链接 问题描述 给定一个N行M列的矩阵,往里面填入$1-N\times M$个数字,使得这个矩阵每行.每列都满足递增.问:有多少种填法? 问题分析 这个问题很难,如果能够直接想到,那就是天才了. ...