08策略模式Strategy
一、什么是策略模式
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的更多相关文章
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy 与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...
- 策略模式-Strategy(Java实现)
策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...
随机推荐
- android:ProgressBar控件
ProgressBar 用于在界面上显示一个进度条,表示我们的程序正在加载一些数据.它的用 法也非常简单,修改 activity_main.xml 中的代码,如下所示: <LinearLayou ...
- [Android] 判断手机上是否安装了某个程序
http://blog.csdn.net/xiaodongrush/article/details/9320135 1. 首先得到该程序的包名 这个连上手机ADB,看logcat就能看到.比如:QQ客 ...
- CNC系统的多任务并行处理
(1) CNC系统的多任务性.CNC系统通常作为一个独立的过程控制单元用于工业自动化生产中,因此它的系统软件必须完成管理和控制两大任务.系统的管理部分包括输入.I/O处理.显示和诊断.系统的控制部分包 ...
- python 中的 easydict
写在前面:当遇到一个陌生的python第三方库时,可以去pypi这个主页查看描述以迅速入门!或 import time dir(time) easydict的作用:可以使得以属性的方式去访问字典的值! ...
- plsql连接oracle数据库,不用配置任何东西(转)
在软件开发的过程中,对于使用oracle的朋友们来说,使用plsql工具操作oracle数据库是非常方便的,可是plsql连接oracle数据库的方式有很多种,今天就给大家介绍一种最简单的连接方式,只 ...
- shell编程学习笔记(一):编写我的第一段代码
目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...
- PhoneGap-Android-HTML5-WebSocket
https://github.com/FreakDev/PhoneGap-Android-HTML5-WebSocket
- 【Windows】Dos中的日期的和时间
在Dos中,我们可以通过动态变量DATE来取得当前日期,通过动态变量TIME来取得当前日期.实例1 C:\Users\hubin5>echo %date% 2013/03/11 周一 C:\Us ...
- 剖析 Linux hypervisor
hypervisor 之于操作系统类似于操作系统之于进程.它们为执行提供独立的虚拟硬件平台,而虚拟硬件平台反过来又提供对底层机器的虚拟的完整访问.但并不是所有 hypervisor 都是一样的,这是件 ...
- spring boot+ Intellj idea devtools 设置热部署
POM文件 <!--添加依赖--> <dependency> <groupId>org.springframework.boot</groupId> & ...