直截了当的告诉你什么是策略模式

策略模式的实现也是非常简单。还是那句话,直截了当,废话不多说。

模拟一个计算运费的程序

/// <summary>
/// 配送方式
/// </summary>
public enum ShippingOptions
{
    EMS = 0,
    顺丰 = 1,
    圆通 = 2,
    中通 = 4,
    天天 = 8,
    宅急送 = 16
}
public class Order
{
    public int Id { get; set; }
    public ShippingOptions ShippingMethod { get; set; }
}
public class ShippingCostCalculatorService
{
    /// <summary>
    /// 计算运费
    /// </summary>
    /// <param name="order">订单</param>
    /// <returns></returns>
    public double CalculateShippingCost(Order order)
    {
        switch (order.ShippingMethod)
        {
            case ShippingOptions.EMS:
                return 15.00d;
            case ShippingOptions.顺丰:
                return 10.00d;
            case ShippingOptions.圆通:
                return 3.00d;
            case ShippingOptions.中通:
                return 1.00d;
            case ShippingOptions.天天:
                return 8.00d;
            case ShippingOptions.宅急送:
                return 5.00d;
            default:
                throw new Exception("Unknown carrier");
        }
    }
}

上面代码有什么问题?未来可能会推出新的配送方式,这也完全合理,我们必须手动修改swich语句,我们程序里不光这一个地方写了switch,这样的话就会出问题

解决办法:

public interface IShippingStrategy
{
    double Calculate(Order order);
}
/// <summary>
/// 顺丰
/// </summary>
public class SF : IShippingStrategy
{
    public double Calculate(Order order)
    {
        return 10.00d;
    }
}

/// <summary>
/// 中通
/// </summary>
public class ZTO : IShippingStrategy
{
    public double Calculate(Order order)
    {
        return 1.00d;
    }
}还有其他方式我就不写了
public class ShippingCostCalculatorService
{
    private readonly IShippingStrategy _shippingStrategy;
    public ShippingCostCalculatorService(IShippingStrategy shippingStrategy)
    {
        _shippingStrategy = shippingStrategy;
    }
    /// <summary>
    /// 计算运费
    /// </summary>
    /// <param name="order">订单</param>
    /// <returns></returns>
    public double CalculateShippingCost(Order order)
    {
        return _shippingStrategy.Calculate(order);
    }
}

看到这里大家应该清楚Calculate方法是通过接口在调用,那么_shippingStrategy这个接口变量里面装的到底是哪个对象?
是由订单Order的配送方式决定的。
如果配送方式是顺丰,接口变量里面应该装的就是SF,
如果配送方式是中通,那么接口变量里面装的就是ZTO,
那怎么通过订单的配送方式创建不同的对象呢?下一节 抽象工厂 ,好了,就是这么直截了当。

时间: 2024-10-13 07:35:18

直截了当的告诉你什么是策略模式的相关文章

直截了当的告诉你什么是工厂模式

千万不要以为创建一个类,以Factory为后缀就是工厂,那不是工厂. 直接演示: public interface IMachine { string Name { get; } /// <summary> /// 机器启动 /// </summary> void TurnOn(); } public class Computer : IMachine { public string Name { get { return "戴尔"; } } public vo

策略模式(行为型)

思考问题: 一个书店的某类书是免费的,某类书是固定1元的,某类书是按折扣算的(比如88%)(同一类别的书本价格一样).假定顾客只买一类书,在设计书店BookStore类时应该如何计算顾客买书的费用? 解答: 1. 你有可能不知道如何设计,毕竟上面的计算规则不一样(并不是一类书8折另一类书9折那样好计算): 2. 既然这样,我们就定义一个接口(策略接口),规定一个方法(strategyInterface())为计算金额的方法,BookStore类构造对象时传入该策略接口的实现类对象(在构造该对象时

【设计模式】 模式PK:策略模式VS桥梁模式

1.概述 我们先来看两种模式的通用类图. 两者之间确实很相似.如果把策略模式的环境角色变更为一个抽象类加一个实现类,或者桥梁模式的抽象角色未实现,只有修正抽象化角色,想想看,这两个类图有什么地方不一样?完全一样!正是由于类似场景的存在才导致了两者在实际应用中经常混淆的情况发生,我们来举例说明两者有何差别. 大家都知道邮件有两种格式:文本邮件(TextMail)和超文本邮件(HTMLMaiL),在文本邮件中只能有简单的文字信息,而在超文本邮件中可以有复杂文字(带有颜色.字体等属性).图片.视频等,

直截了当的告诉你什么是适配器模式

适配器模式绝对是软件开发当中最受关注的设计模式之一. 正如标题所说,我会直截了当的告诉你什么是适配器模式,不说太多的废话,因为设计模式这种东西需要慢慢的去体会.只有多思多闻,才能领会这些模式真的是设计的很巧妙. public class Customer { } public interface ICustomerRepository { IList<Customer> GetCustomers(); } public class CustomerService { private reado

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

转:策略模式

原文地址:http://blog.csdn.net/hguisu/article/details/7558249 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有

简单工厂模式和策略模式的差别

直接上代码: 简单工厂模式: ------------------------------一个抽象类   -------------------------- abstract class AbsClass { //抽象方法:提供一些列的算法操作 public abstract void acceptCash(string org); } ------------------------------2个实现类   -------------------------- //继承自抽象类 class

(七)策略模式详解

上章我们着重讲解了观察者模式和事件驱动,那么本章来讨论一个个人认为在开发过程中出场率极高的设计模式,策略模式. 策略模式在LZ第一次接触到的时候,LZ是这么理解的,就是如果我们想往一个方法当中插入随便一段代码的话,就是策略模式.即如下形式. [java] view plaincopy <EMBED id=ZeroClipboardMovie_1 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pl