二 策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合

策略模式封装了变化

在实践中,我们发现可以用它来封装几乎任类型的规则,只要在分析过程中听到需要在不同时间应用到不同的业务规则,就考虑使用策略模式来处理这种变化的可能

商场促销例子

现金收费抽象类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace factoryClass.Strategy
{
    /// <summary>
    /// 现金收费抽象类
    /// </summary>
   public abstract class CashSuper
    {
       /// <summary>
       /// 超类的抽象方法,收取现金
       /// </summary>
        /// <param name="money">参数为原价</param>
        /// <returns>返回为当前价</returns>
       public abstract double acceptCash(double money);
    }
}

正常收费子类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

打折收费子类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace factoryClass.Strategy
{
    /// <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 moneyRebate * money;
        }
    }
}

返利收费子类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace factoryClass.Strategy
{
    /// <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 resurt = money;
            if (money >= moneyCondition)
            {
                resurt = money - Math.Floor(money / moneyCondition) * moneyReturn;
            }
            return resurt;
        }
    }
}

CashContext类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace factoryClass.Strategy
{
   public class CashContext
    {
        CashSuper cs=null;//申明一个CashSuper对象

       /// <summary>
        /// CashContext
       /// </summary>
       /// <param name="type">促销类型</param>
       /// <param name="moneyRebates">折扣</param>
       /// <param name="moneyCondition">满</param>
       /// <param name="moneyReturn">返</param>
        public CashContext(string type, string moneyRebates, string moneyCondition, string moneyReturn)
       {
           switch (type)
           {
               case "0":
                   CashNormal cs0 = new CashNormal();
                   cs = cs0;
                   break;
               case "1":
                   CashRebate cs1 = new CashRebate(moneyRebates);
                   cs = cs1;
                   break;
               case "2":
                   CashReturn cs2 = new CashReturn(moneyCondition, moneyReturn);
                   cs = cs2;
                   break;

           }
       }

       /// <summary>
       /// 根据收费策略不同,获得计算结果
       /// </summary>
       /// <param name="money"></param>
       /// <returns></returns>
       public double GetResult(double money)
       {
           return cs.acceptCash(money);
       }
    }
}

客户端

 protected void btnA_Click(object sender, EventArgs e)
        {
            factoryClass.Strategy.CashContext cashContext = new factoryClass.Strategy.CashContext(this.ddlcu.SelectedValue,this.ddlzhe.SelectedValue,this.txtman.Text,this.txtfan.Text);
            this.txtying.Text = cashContext.GetResult(Convert.ToDouble(this.txtprice.Text)).ToString();
        }

时间: 2024-10-03 21:10:32

二 策略模式的相关文章

领域驱动系列二策略模式的应用

一.简介 随着模型的不断扩大,发现模型中不单单只有"名词",还有许多"谓词",简言之,就是领域知识中,会参杂者许多的业务规则,他们和实体一样,都扮演者领域模型中的核心角色. 所以我们在建立领域模型的时候,不单单只关注实体和值对象,业务规则也被纳入到了领域模型中,如果业务规则变化不频繁,我们可以使用硬编码来解决,但是实际开发中业务规则的变化往往是变化的非常频繁的.当然你可以使用大量的If else来解决这个问题,但是这种代码是很难维护的.而且会影响原先的业务,所以这个

设计模型之二策略模式

//strategy model //策略模式是一种定义一系列算法的方法 #include<iostream> using namespace std; //一个抽象的策略类 class Strategy{ public: virtual void algorithmInterface()=0; }; //三种不同策略 class StrategyA:public Strategy{ void algorithmInterface() { cout<<"A strateg

计算器软件的代码实现 (策略模式)

一 封装时策略模式的书写 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace shuxuefudao { class qita { public void qingkong() { File.WriteAllText("writer.txt", string.Empty); File.WriteAllText(&q

设计模式(1)--简单工厂模式、策略模式

1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 先放图再解释.下图一是从<大话设计模式>中摘出来的.问题是:用任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果. 简单工厂模式实现的关键点有两个: 1. 继承:定义一个抽象父类“抽象产品”(Operation类

二、策略模式

1 策略模式实际上就是应对有各种策略(实现方法)的需求.比如超市促销,有多种多样的促销策略,这时候就要想到策略模式,策略模式一般会配合工厂模式使用. 代码如下: package com.biao.strategy.original; /** * * @author biao * 策略模式:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用 * 算法的客户. * * 应用:商场各种促销方案. * * 记忆方法:一个超类的算法家族+一个context容器.容器内

二、策略模式-商场促销活动

以商场收银为例,理解并实践"策略模式". 简单商场促销活动描述:营业员提供商品单价.数量.商场目前的活动(满减.打折等),计算用户最终需要支付的金额. 一.面向过程的实现方式 1 package secondStrategy; 2 import java.text.DecimalFormat; 3 public class StrategyTest { 4 public static void main(String[] args) { 5 // 营业员提供信息 6 double to

设计模式实现(二)——策略模式的C++实现

一.策略模式的概念 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 二.例子 (1) Strategy抽象类的实现 1 #ifndef STRATEGY_H 2 #define STRATEGY_H 3 4 class Strategy { 5 public: 6 Strate

&amp;lt;二&amp;gt;读&amp;lt;&amp;lt;大话设计模式&amp;gt;&amp;gt;之策略模式

又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.client依赖两个类.耦合性高:2.假设算法过多则须要写非常多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族.分别封装起来.让它们之间能够互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单位价格*打

&lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

又和大家见面了,能够坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>讲解策略模式是以商场收银软件程序开头的,那么问题来了,哪家商场收银软件强,开玩笑了.读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.客户端依赖两个类,耦合性高:2.如果算法过多则需要写很多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单价*打折算法=售价.