- 浏览: 1060802 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (399)
- C++ (39)
- Java (74)
- Java界面开发学习笔记 (4)
- Java用户的c++之旅 (0)
- 自言自语 (12)
- DSP (1)
- MCU (0)
- CG (0)
- Jabber (0)
- Gloox (0)
- Linux (11)
- Windows (19)
- Networks (4)
- Jobs (0)
- PHP (1)
- JSP (2)
- 生活 (35)
- C (2)
- Qt4 (2)
- C# (50)
- WPF (5)
- ASP (2)
- FLEX (47)
- SQL (20)
- JavaScript (12)
- SharePoint (6)
- GWT (1)
- Dojo (9)
- HTML (11)
- Others (7)
- 如何安装配置系列 (7)
- UML (2)
- Android (3)
- alibaba (1)
最新评论
-
zxjlwt:
学习了http://surenpi.com
Firefox插件开发: Hello World! -
ylldzz:
楼主知道MVEL怎么调试么
MVEL简介及快速使用 -
blueman2012:
您好,可否提供源码下载,我把您的代码贴过来后,好多报错的,谢谢 ...
Log4J日志解析 -
svygh123:
你的游标都没有关闭呢!
MYSQL游标嵌套循环示例 -
dizh:
写的很好啊
MVEL简介及快速使用
一、概念
策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)
图1 策略模式类图
优点:
1、 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
缺点:
1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
2、 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。(这本身没有解除客户端需要选择判断的压力,而策略模式与简单工厂模式结合后,选择具体实现的职责也可以由Context来承担,这就最大化的减轻了客户端的压力。)
参考阅读:
1. 2.
二、我的理解
其实这个策略模式和简单工厂模式一样,仅仅是对面向对象继承中常用的Override技术的一种应用。简单工厂模式中有一个工厂类,负责根据输入参数的不同来生成不同的子类,并将生成的子类作为基类返回(这样可以让客户端在使用的时候很方便)。客户端只需要调用工厂类创建一个基类的实例,然后调用这个实例的函数来实现自己的功能。而策略模式中的Context类的功能基本上就是对工厂类的强化版本,它也负责根据输入参数来生成不同的类,只是它并不返回生成类,而是将生成类所实现的功能接口包装一次,提供给客户。这样对客户来说,他们只需要知道这一个Context类就可以完成他们想要的功能,而不必再知道其他的信息。
三、策略模式与简单工厂模式结合的代码实现
下面以一个简单的商场收银系统为例,演示一下策略模式与简单工厂模式结合的使用。我将这个系统用两个工程实现。一个工程实现商场计费的业务功能,另一个工程用于实现POS机上的界面,也就是客户端。
首先介绍第一个工程:
1. 实现计费功能的基类(这里用抽象类实现):
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StrategeDemo { public abstract class BillingAlgorithm { public abstract double getBillingResult(double price, int quantity); } }
2. 实现具体计费功能的子类:
2.1 实现打折计费的子类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StrategeDemo { public class BillingStrategy_Rebate : BillingAlgorithm { double discounts; public BillingStrategy_Rebate(double discounts) { if (discounts < 0.0000001 || discounts >= 1) { this.discounts = 1; } else { this.discounts = discounts; } } public override double getBillingResult(double price, int quantity) { return price * quantity * discounts; } } }
2.2 实现返现计费功能的子类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StrategeDemo { public class BillingStrategy_CashReturn : BillingAlgorithm { int CashCondition; int CashReturn; public BillingStrategy_CashReturn(int CashCondition, int CashReturn) { if (CashCondition <= 0) { CashCondition = 1; } if (CashReturn <= 0) { CashReturn = 1; } this.CashCondition = CashCondition; this.CashReturn = CashReturn; } public override double getBillingResult(double price, int quantity) { double orignal = price * quantity; int n = (int)(orignal / CashCondition); return orignal - CashReturn * n; } } }
3. Context类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StrategeDemo { public class Billing { //维护一个算法基类的实例 BillingAlgorithm billingAlgorithm; //简单工厂模式的构造函数 public Billing(string BillingStrategy) { switch (BillingStrategy) { case "打8折": billingAlgorithm = new BillingStrategy_Rebate(0.8); break; case "满200返40": billingAlgorithm = new BillingStrategy_CashReturn(200, 40); break; default: billingAlgorithm = new BillingStrategy_Rebate(1); break; } } //策略模式的构造函数 public Billing(BillingAlgorithm billingAlgorithm) { this.billingAlgorithm = billingAlgorithm; } //这是策略模式的典型特征 public double GetResult(double price, int quantity) { return billingAlgorithm.getBillingResult(price, quantity); } } }
好,算法完成了,下面介绍客户端,界面如图2所示:
图2. 商场收银系统界面
下面看一下,确定按钮后面的代码:
private void button1_Click(object sender, EventArgs e) { //只需要知道这个Context类,实例化它; Billing billing = new Billing(comboBox1.Text); //并调用它提供的方法,即可完成我们需要的功能。 double charge = billing.GetResult(double.Parse(textBox1.Text), int.Parse(textBox2.Text)); string itemShow = "单价:" + textBox1.Text + "\t数量:" + textBox2.Text + ".\t实收:" + charge.ToString() + "\t" + comboBox1.Text; listBox1.Items.Add(itemShow); }
转自:http://www.cnblogs.com/colinsong/archive/2009/03/02/1401723.html
- StrategyDemo.rar (39.4 KB)
- 下载次数: 0
发表评论
-
C#获取返回错误码
2010-05-21 17:59 1780[DllImport("TestWin32Dl ... -
VS.NET 开发Windows服务的步骤
2010-05-20 14:25 1569在很多应用中需要做windows服务来在一些后台操作,比如监视 ... -
c# 允许服务与桌面交互
2010-05-20 14:20 2664我们写一个服务,有时候要让服务启动某个应用程序,就要修 ... -
C#单例模式的三种写法
2010-05-19 15:58 48525第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, ... -
C#中获取我的文档系统文件夹路径
2010-05-17 15:29 2238本技巧使用GetFolderPath方法来获取指向由指定枚 ... -
C#自定义事件的步骤介绍
2010-05-13 17:54 3253通常C#自定义事件有下面的几个步骤: ... -
使用反射机制遍历对象中的属性名及属性值
2010-05-03 16:20 2801首先描述一种情景,当给你一个VO类(这个类是映射到数据库的表 ... -
C#的逆向工程-IL指令集
2010-04-30 10:28 1592一些 IL 语言解释: ... -
使用SqlHelper时“阅读器关闭时read的尝试无效”的解决方法
2010-04-20 14:54 1786原SqlHelper类中ExecuteReader方法体 ... -
C# 删除文件夹
2009-12-31 11:28 2499/// <summary> ... -
System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
2009-12-16 23:44 5158.NET Framework里面提供了三种Timer: ... -
关于var1=var2=something赋值语句的思考
2009-11-18 16:16 1198刚才在阅读《c#本质论》一书时,开头有提到var1=var2= ... -
C#使textbox滚动到最新一行
2009-11-16 12:33 2452方法1: textBox.Text += " ... -
Invoke()/BeginInvoke()区别
2009-11-15 17:43 7170查看MSDN如下: Control..::.Inv ... -
Invoke 和 BeginInvoke 的真正涵义
2009-11-15 17:37 1289BeginInvoke 方法真的是新开一个线程进行异步调用 ... -
编写安全的多线程C#程序
2009-11-15 01:24 1876与多线程相关的两个常见的需要解决的问题是:临界资源保护和线 ... -
线程,同步与锁——Lock你到底锁住了谁
2009-11-15 01:18 1567线程在多核时代的优势月来越明显,多线程编程的学习也提上议事日程 ... -
关于lock(this)的说明及用法
2009-11-15 01:16 5284一. 为什么要lock,lock了 ... -
远程dll注入 C#
2009-11-14 16:43 3094using System; using System. ... -
C# 3.0新特性之扩展方法
2009-11-09 17:02 952C#3.0扩展方法是给现有类型添加一个方法。现在类型既可是基本 ...
相关推荐
策略模式结合模板方法模式
策略模式的 C++ 代码实现, ide :XCode
策略模式定义了方法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 还可以那家咖啡屋,记忆里很温馨,很sugar,或许很多温馨美好的回忆都是于咖啡有关的。 我们常常说设计...
所有模式都可分为类模式和对象模式两种,类模式是继承,对象模式是委托,而桥接模式和策略模式都是将任务委托给另外一个接口去实现,那么两者的区别什么呢?
主要介绍了详解SpringBoot结合策略模式实战套路,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
技术: 1. spring事件驱动(ApplicationEventPublisher) 2. 策略模式处理事件 目的: 1. 通过event,代码逻辑异步处理 2. 通过策略模式,构建具体监听实现 3. 解耦 4. 容错(降低代码块错误风险)
这是策略模式中的一个经典实例,通过鸭子问题,能让学习者更好的了解设计模式,这也是headfirst 设计模式中用的经典实例
深入浅出设计模式之抽象工厂模式+工厂方法模式+策略模式实现手机加工厂(加类图)
策略模式实例策略模式实例策略模式实例策略模式实例策略模式实例
策略模式代码,两种方式实现,第一种,通过map存储方式,第二种,通过配置文件加反射方式
策略模式的简单例子,根据《Head First设计模式》中第一章中的Duck编写
策略模式例子,纯代码,copy后即可运行; 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中...
策略模式在实际项目中的应用二,该测试demo为普通项目,导入build path一下lib目录下的jar包,然后运行测试类即可在控制台看到测试结果
处理层的设计采用了设计模式中的策略模式、模板方法模式和工厂模式。 Server端和Client端的实现也采用了分层的设计方式,包含自定义的模型层、视图层和控制层。 说明:程序采用配置文件的方式进行初始化,运行时时请...
55-Java设计模式之策略模式与状态模式1
设计模式中的策略模式,同时兼容简单工厂模式,商场收银模式,易懂可用。
策略模式策略模式策略模式
javascript的策略模式和代理模式简介,附代码
在网络上看到几个加密解密算法,本着"取之于民用之于民"的方针测试一下,并用策略模式将这些算法封装共享。
设计模式中的策略模式,template模式详细讲解。