策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响使用算法的用户。

针对商城收银模式,打折,返现促销等的例子:

打折还是促销其实都是一些算法,可以用工厂模式来生成算法对象,但算法本身只是一种策略,重要的是这些算法随时都可能替换的,而封装变化点是我们面向对象的一种重要的思维方式,首先来看下策略模式的结构图和基本代码:

1)结构图

2)代码

strategy类,定义所有支持的方法的公共接口

    public abstract class Strategy
{
//算法公告接口
public abstract void AlgorithmInterface();
}

ConcreteStrategy,封装了具体的方法或行为,继承strategy

    public class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法A的实现");
}
}
public class ConcreteStrategyB :Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法B的实现");
}
}

Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用

    public class Context
{
private Strategy strategy; public Context(Strategy strategy)
{
this.strategy = strategy;
} //上下文接口
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}

客户端代码:

        static void Main(string[] args)
{
Context context; context = new Context(new ConcreteStrategyA());
context.ContextInterface(); context=new Context(new ConcreteStrategyB());
context.ContextInterface(); Console.ReadLine();
}

用策略模式来实现商场收费:

定义公共接口和各种收费策略

//定义公共收费接口类
public abstract class CashSuper
{
//公共的收费接口
public abstract double acceptCash(double money);
}
//定义各种收费策略
public class CashNomal:CashSuper
{
public override double acceptCash(double money)
{
return money;
}
}
public class CashRebate:CashSuper
{
private double rebate = ;
public CashRebate(string rebate)
{
this.rebate = Convert.ToDouble(rebate);
} public override double acceptCash(double money)
{
return money * this.rebate;
}
} public class CashReturn:CashSuper
{
public double condition = 0.0d;
public double returnMoney = 0.0d; public CashReturn(string condition, string returnMoney)
{
this.returnMoney = Double.Parse(returnMoney);
this.condition = Double.Parse(condition);
}
public override double acceptCash(double money)
{
double result = money;
if(money >= condition)
{
result = money - Math.Floor(result/condition)*returnMoney;
}
return result;
} }

定义Context:

    public class CashContext
{
private CashSuper cashsuper;
public CashContext(CashSuper cs)
{
cashsuper = cs;
}
public double GetResult(double money)
{
return cashsuper.acceptCash(money);
}
}

客户段代码:

        static void Main(string[] args)
{
double totle = 500.0d;
double result = 0.0d;
CashContext context;
context = new CashContext(new CashNomal());
result = context.GetResult(totle);
Console.WriteLine(result); context = new CashContext(new CashRebate("0.3"));
result = context.GetResult(totle);
Console.WriteLine(result); context =new CashContext(new CashReturn("",""));
result = context.GetResult(totle);
Console.WriteLine(result); Console.ReadLine();
}

大话设计模式之策略模式(strategy)的更多相关文章

  1. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  2. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  3. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  4. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  5. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  6. [设计模式] 21 策略模式 Strategy

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...

  7. 大熊君说说JS与设计模式之------策略模式Strategy

    一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...

  8. 设计模式之策略模式Strategy

    /** * 策略设计模式 * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为. * 问题:设计一个鸭子模拟游戏. * 现在有一群鸭子: * ①这些鸭可以有飞的行为(分为快和慢) ...

  9. 设计模式 笔记 策略模式 Strategy

    //---------------------------15/04/28---------------------------- //Strategy 策略模式----对象行为型模式 /* 1:意图 ...

随机推荐

  1. [D3] 10. Creating Axes with D3

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. Servlet中文乱码解决方法

    程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件. 字节流和字符流的区别: 在Java.io包中操作文件内容的主要有两大类:字节流.字符流,两类都分为输入和输出操作. 在字节流中输 ...

  3. ubuntu14.04使用root用户登录桌面 分类: 学习笔记 linux ubuntu 2015-07-05 10:30 199人阅读 评论(0) 收藏

    ubuntu安装好之后,默认是不能用root用户登录桌面的,只能使用普通用户或者访客登录.怎样开启root用户登录桌面呢? 先用普通用户登录,然后切换到root用户,然后执行如下命令: vi /usr ...

  4. Vmare12(虚拟机)安装Mac OS X Yosemite 10.10

    需要预备的软件如下: OSX10.10的系统镜像,下载好之后将后缀.cdr改成.iso,下载来源如下:    链接:http://pan.baidu.com/s/1sj4ri5R 密码:y86w un ...

  5. 初建FreeMarker工程

    初建FreeMarker工程 ——@梁WP 背景:听说freemarker可以用来写页面的组件,热衷于编写可重用代码的我,迫不及待地研究了freemarker,不过,在写组件之前,还是先研究一下fre ...

  6. servlet登录

    package com.lxr.servlet; import java.io.IOException; import java.io.PrintWriter; import java.sql.Pre ...

  7. 4G上网卡NIDS拨号之Rmnet驱动

    4G上网卡一般为双对外通讯口,一个是串口.一个是USB. 但是基于串口的常用波特率为115200,速度过于底下,所以大多使用USB. 1)一般来说常用ppp拨号方式,ppp拨号方式分为应用层pppd与 ...

  8. 服務器提交協議衝突 (The server committed a protocol violation.)

    ---解決方法 (放在 app.config / web.config)--- <system.net> <settings> <httpWebRequest useUn ...

  9. bootstrap 模态框关闭状态怎么获取

    比如现在有个场景,一个事件 需要在模态框关闭之后再执行自己的逻辑,先上图: 参考官网说明:http://v3.bootcss.com/javascript/#modals-events //每次关闭模 ...

  10. (转)php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法

    php 获取今日.昨日.上周.本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime. 下面首先还是直奔主题以示例说明如何使用 mktime 获取今日.昨日.上周.本月的起 ...