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 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...
随机推荐
- 使用 Docker 搭建 Tomcat 运行环境
转自: http://m.oschina.net/blog/616526, 版权归原作者所有. 1 Docker与虚拟机 2 搭建过程 2.1 准备宿主系统 准备一个 CentOS 7操作系统 ...
- 在远程桌面服务中配置RD网关直接访问内网
原文地址:http://wangchunhai.blog.51cto.com/225186/1139388/ 远程桌面网关(RD 网关)是一项角色服务,使授权远程用户可以从任何连接到 Internet ...
- Sql Server中sql语句自己主动换行
怎么让sql server中的sql语句自己主动换行呢? 例如以下图: 工具--选项--全部语言 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbm ...
- Window Server 2008 R2 TFS2010 安装前的准备
前言 http://www.cnblogs.com/aehyok/p/3979707.html 这里简单介绍了安装windows Server 2008 R2系统,接下来就开始介绍安装Team Fou ...
- 在DevExpress程序中使用内置的图标构建美观的界面元素【转】
https://www.cnblogs.com/wuhuacong/p/6217012.html 在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及 ...
- MDX Cookbook 02 - 除数为零的问题
先直接看一个例子 - WITH MEMBER [Date].[Calendar Year].[CY 2006 vs 2005 Bad] AS ], FORMAT_STRING = 'Percent' ...
- Linux中使用Vim快速更换文档中Windows换行符为Linux平台
一.简述 平时我们把Windows编写好的sh文件放在linux上跑时,经常出现换行符的问题.快速切换的解决方法如下: 二.解决 vim test.sh :set ff? 如果出现fileforma= ...
- 关于unity3dGUI(uGUI)的一些自适应的收获,在这里跟大家分享一下
假设大家要转载这篇文章,请注明出处.本人名字叫赖张殷,博客地址为http://my.csdn.net/?c=674f97f953e5dbfdba9fefaa3d1fcbe1 //2017年5月12日改 ...
- 【Zookeeper】源码分析之网络通信(二)之NIOServerCnxn
一.前言 前面介绍了ServerCnxn,下面开始学习NIOServerCnxn. 二.NIOServerCnxn源码分析 2.1 类的继承关系 public class NIOServerCnxn ...
- oracle 11g 安装及netca,dbca乱码之解决
在中文Linux下安装Oracle 11g,运行runInstaller后默认会出现乱码,解决办法如下: 1.准备字体zysong.ttf,点击下载,解压下载到的fallback 2.使用归档管理器打 ...