设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,
不会影响到使用算法的客户。
示例:商场收银系统,实现正常收费、满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)的更多相关文章
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- 设计模式--策略模式(strategy)
1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- 设计模式——策略模式(Strategy Pattern)
写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...
- 说说设计模式~策略模式(Strategy)
返回目录 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.而对于客户端(UI)来说,可以通过IOC再配合工厂模块,实现动态策略的切换,策略模块通常于一个抽象策略对象(in ...
- C#设计模式——策略模式(Strategy Pattern)
一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...
- 设计模式-策略模式Strategy以及消灭if else
概述 如果在开发过程中,出现大量的if else或者switch case 语句,如果这些语句块中的代码并不是包含业务逻辑,只是单纯的分流方法,那么,每一个语句块中都是一个算法或者叫策略. 背景 比如 ...
- 设计模式---策略模式Strategy(对象行为型)
1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不 ...
- 大话设计模式--策略模式 strategy -- C++实现实例
1. 策略模式: 它定义了算法家族, 分别封装起来,使他们之间可以相互替换,此模式让算法变化, 不会影响到使用算法的客户. 用相同的方法调用不同的算法,减少各种算法类与使用算法类之间的耦合. 实例中策 ...
随机推荐
- AMPPZ2014
[AMPPZ2014]The Lawyer 记录每天结束的最早的会议以及开始的最晚的会议即可. #include<cstdio> #define N 500010 int n,m,i,d, ...
- 升级到WP8必需知道的13个特性
http://www.cnblogs.com/sonic1abc/archive/2012/11/28/2792467.html Windows phone 8 SDK 已经发布一段时间了, 已经 ...
- 【wikioi】1250 Fibonacci数列(矩阵乘法)
http://wikioi.com/problem/1250/ 我就不说这题有多水了. 0 1 1 1 矩阵快速幂 #include <cstdio> #include <cstri ...
- kernel里面出现了类似isegfault at xxx ip 错误
今天同时碰到了错误如下,但是没有core,当时通过代码审查解决了问题,后续再查的时候发现可以使用addr2line 查找代码行, segfault at 10000 ip b7f0f48a sp bf ...
- jquery-mobile表单提交问题
关于使用jquery-mobile表单提交遇到的问题 当你使用了jquery-mobile的时候,如果你在前台提交一个了一个form表单,而在后台你处理完业务逻辑之后想要重定向到另一个方法或页 ...
- JS倒计时代码
第一种:精确到秒的javascript倒计时代码 HTML代码: <form name="form1"> <div align="center" ...
- shell 循环
for循环: 批量删除.gz结尾的文件: 循环打包文件并备份到一个目录下面: find ./ -maxdepth 1 -name "*.gz" find ./ -maxdepth ...
- 在Eclipse中配置Tomcat 创建和运行Servlet/JSP
在Eclipse中配置Tomcat 创建和运行Servlet/JSP 步骤一:在Eclipse中配置Tomcat(注意下载Eclipse IDE for Java EE Developers) (1) ...
- 1215课后练习----indexOf的用法
package com.hanqi; public class Testco { public static void main(String[] args) { String str1 = &quo ...
- 注意自己的dns设置 - 阿权的书房
一般而言,随便找个合适的dns服务器作为自己的dns解析服务器即可,但如果选择不当,可能就会导致网络选择并不是最优的.这个情况一般发生在电信网通优化的域名上. 检查方法(域名有所替换): [root@ ...