定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,

不会影响到使用算法的客户。

示例:商场收银系统,实现正常收费、满300返100、打8折.......等不同收费方式

效果图:

结构图

HTML代码

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>设计模式:策略模式</title>
<style type="text/css">
table
{
width: 300px;
height: 250px;
border-collapse: collapse;
}
table, tr, td
{
border: 1px solid gray;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<table>
<thead>
<tr>
<td colspan="3">
商场收银软件
</td>
</tr>
</thead>
<tr>
<td>
单价:
</td>
<td>
<asp:TextBox runat="server" ID="txtPrice"></asp:TextBox> </td>
<td>
<asp:Button runat="server" ID="btnOK" Text="确定" onclick="btnOK_Click" />
</td>
</tr>
<tr>
<td>
数量:
</td>
<td>
<asp:TextBox runat="server" ID="txtNumber"></asp:TextBox>
</td>
<td>
<asp:Button runat="server" ID="Button1" Text="重置" onclick="Button1_Click" />
</td>
</tr>
<tr>
<td>
计算方式:
</td>
<td>
<asp:DropDownList runat="server" ID="ddlCashType">
<asp:ListItem Selected="True">正常收费</asp:ListItem>
<asp:ListItem>打8折</asp:ListItem>
<asp:ListItem>满300返100</asp:ListItem>
</asp:DropDownList>
</td>
<td>
</td>
</tr>
<tr>
<td colspan="3">
<asp:TextBox runat="server" ID=txtMsg TextMode="MultiLine" Rows="8" Columns="30"></asp:TextBox>
</td>
</tr>
<tr>
<td>
总计:
</td>
<td>
<asp:Label runat="server" ID="lblTotal"></asp:Label>
</td>
<td>
</td>
</tr>
</table>
</form>
</body>
</html>

CashContext类

  public class CashContext
{
CashSuper cs = null; public CashContext(string type)
{
switch (type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满300返100":
cs = new CashReturn("", "");
break;
case "打8折":
cs = new CashRebate("0.8");
break;
}
} public double GetResult(double money)
{
return cs.AcceptCash(money);
}
}

CashSuper类

/// <summary>
/// 现金收费抽象类
/// </summary>
public abstract class CashSuper
{
public abstract double AcceptCash(double money);
}

CashNormal类

/// <summary>
/// 正常收费子类
/// </summary>
public class CashNormal : CashSuper
{
public override double AcceptCash(double money)
{
return money;
}
}

CashRebate类

 /// <summary>
/// 打折收费子类
/// </summary>
public class CashRebate : CashSuper
{
private double moneyRebate = 1d;
public CashRebate(string moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);
} public override double AcceptCash(double money)
{
return money * moneyRebate;
}
}

CashReturn类

 /// <summary>
/// 返利收费子类
/// </summary>
public class CashReturn : CashSuper
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d; public CashReturn(string moneyCondition, string moneyReturn)
{
this.moneyCondition = double.Parse(moneyCondition);
this.moneyReturn = double.Parse(moneyReturn);
} public override double AcceptCash(double money)
{
double result = money;
if (money >= moneyCondition)
{
result = money -Math.Floor(money / moneyCondition) * moneyReturn;
} return result;
}
}

客户端实现

        protected void btnOK_Click(object sender, EventArgs e)
{
CashContext csuper = new CashContext(ddlCashType.SelectedValue); string totalPrice = csuper.GetResult(Convert.ToDouble(txtNumber.Text)*Convert.ToDouble(txtPrice.Text)).ToString(); lblTotal.Text = totalPrice;
}

策略模式和简单工厂模式区别:

用途不一样,名字就有区别,一把斧头用来砍人就叫凶器,用来砍材就叫伐木斧,用来劈门就叫消防斧,这些模式的名字都是根据具体使用时的场景,联系了现实里某样东西或某种习惯而取得,所以很相似的模式行为有不同叫法很正常。

工厂模式:根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。
               即根据你给出一些属性来生产不同行为的一类对象返回给你。
关注对象创建

策略模式:用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。
               即根据你给出对应的对象来执行对应的方法。
关注行为的选择

设计模式:策略模式(Strategy)的更多相关文章

  1. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  2. 设计模式--策略模式(strategy)

    1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...

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

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

  4. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  5. 设计模式——策略模式(Strategy Pattern)

    写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...

  6. 说说设计模式~策略模式(Strategy)

    返回目录 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.而对于客户端(UI)来说,可以通过IOC再配合工厂模块,实现动态策略的切换,策略模块通常于一个抽象策略对象(in ...

  7. C#设计模式——策略模式(Strategy Pattern)

    一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...

  8. 设计模式-策略模式Strategy以及消灭if else

    概述 如果在开发过程中,出现大量的if else或者switch case 语句,如果这些语句块中的代码并不是包含业务逻辑,只是单纯的分流方法,那么,每一个语句块中都是一个算法或者叫策略. 背景 比如 ...

  9. 设计模式---策略模式Strategy(对象行为型)

    1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不 ...

  10. 大话设计模式--策略模式 strategy -- C++实现实例

    1. 策略模式: 它定义了算法家族, 分别封装起来,使他们之间可以相互替换,此模式让算法变化, 不会影响到使用算法的客户. 用相同的方法调用不同的算法,减少各种算法类与使用算法类之间的耦合. 实例中策 ...

随机推荐

  1. 在Unity3D 4中关联Visual Studio 2012来编写C#

    Unity3D自带的MonoDevelop编辑器无论是js还是c#代码提示都很差,很诡异的就是变量名和方法名有的时候提示有的时候不提示.不过用Visual Studio代替MonoDevelop这个问 ...

  2. setTimeout()和setInterval() 何时被调用执行

    定义 setTimeout()和setInterval()经常被用来处理延时和定时任务.setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔 ...

  3. 推荐一个非常COOL的开源相册程序!

    不知道大家有没想过有一个完全属于自己的网络相册?现在网上的相册程序已可以说多不胜数,那么到底要使用哪个会比较好呢? 之前我也在为此事烦恼过,在网上找了很多个程序试了,但都没达到我的要求,后来发终于功夫 ...

  4. 关于 Xcode bitcode 错误

    关于 bitcode 报错 有类似上图关于bitcode的错误用以下方法解决:

  5. tyvj100题留念

    全是水题萌萌哒~0~... 留个纪念

  6. HDU 4671 Partition(定理题)

    题目链接 这题,明显考察搜索能力...在中文版的维基百科中找到了公式. #include <cstdio> #include <cstring> #include <st ...

  7. [BZOJ 4436][Cerc2015]Kernel Knights

    [Cerc2015]Kernel Knights Time Limit: 2 Sec Memory Limit: 512 MBSubmit: 5 Solved: 4[Submit][Status][D ...

  8. BZOJ3444: 最后的晚餐

    Description [问题背景] 高三的学长们就要离开学校,各奔东西了.某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结.因为有m名学生偷偷找他,要求和自己暗恋的同学坐在一起. [问题描述] ...

  9. requirejs模块化框架用法分享

      我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一 ...

  10. CUDA/OpenCL 学习资料

    VS2010 NVIDIA OpenCL 开发环境配置 CUDA 在线课程 [经典培训] 全球首套中文CUDA 教程-胡文美教授主讲