.Net行为型设计模式之策略模式(Stragety)

.Net行为型设计模式之策略模式(Strategy)

策略模式概述

策略模式是一种行为型设计模式,它定义了一系列算法,并且将每个算法封装起来,使得它们可以互相替换。策略模式让算法的变化独立于使用它们的客户端。

策略模式的组成

策略模式由以下几个部分组成:

  • Context:上下文对象,它持有一个具体策略的引用,并调用具体策略的算法。
  • Strategy:策略接口,它定义了一个算法族,包括多个具体策略算法。
  • ConcreteStrategy:具体策略类,实现了策略接口,并提供了一种具体的算法实现。

策略模式的应用场景

策略模式通常用于以下两种情况:

  • 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,可以使用策略模式。
  • 如果类的某个行为有多种实现方式,并且这些方式可以相对自由地切换,可以采用策略模式,封装这些实现并通过上下文来控制实现方式的切换。

策略模式示例

下面是一个简单的示例,其中Context是一个来自电商领域的订单对象,订单有一个总金额(totalAmount)属性,并计算订单的折扣(discount),然后根据应用的优惠策略计算出最终金额(finalAmount)。

public class Order {
    public decimal TotalAmount { get; set; }
    public decimal Discount { get; set; }
    public decimal FinalAmount { get; set; }
}

public interface IDiscountStrategy {
    decimal ApplyDiscount(decimal totalAmount);
}

public class NoDiscountStrategy : IDiscountStrategy {
    public decimal ApplyDiscount(decimal totalAmount) {
        return totalAmount;
    }
}

public class Discount10PercentStrategy : IDiscountStrategy {
    public decimal ApplyDiscount(decimal totalAmount) {
        return totalAmount * 0.9m;
    }
}

public class Discount50PercentStrategy : IDiscountStrategy {
    public decimal ApplyDiscount(decimal totalAmount) {
        return totalAmount * 0.5m;
    }
}

public class OrderService {
    private IDiscountStrategy _discountStrategy;

    public OrderService(IDiscountStrategy discountStrategy) {
        _discountStrategy = discountStrategy;
    }

    public Order Calculate(Order order) {
        order.Discount = _discountStrategy.ApplyDiscount(order.TotalAmount);
        order.FinalAmount = order.TotalAmount - order.Discount;
        return order;
    }
}

在该示例中,IDiscountStrategy是策略接口,它定义了ApplyDiscount方法,具体的策略实现类(NoDiscountStrategy、Discount10PercentStrategy、Discount50PercentStrategy)实现了该方法,并提供了不同的折扣策略。OrderService是上下文对象,该对象通过构造函数注入具体的策略实现对象,并在Calculate方法中使用该对象执行具体的折扣计算。

另外一个示例是对文件进行压缩和解压缩:

public interface ICompressionStrategy {
    void Compress(string sourceFile, string compressedFile);
    void Decompress(string compressedFile, string targetFile);
}

public class ZipCompressionStrategy : ICompressionStrategy {
    public void Compress(string sourceFile, string compressedFile) {
        Console.WriteLine($"Compressing {sourceFile} using ZIP format to {compressedFile}");
    }
    public void Decompress(string compressedFile, string targetFile) {
        Console.WriteLine($"Decompressing {compressedFile} using ZIP format to {targetFile}");
    }
}
public class RarCompressionStrategy : ICompressionStrategy {
    public void Compress(string sourceFile, string compressedFile) {
        Console.WriteLine($"Compressing {sourceFile} using RAR format to {compressedFile}");
    }
    public void Decompress(string compressedFile, string targetFile) {
        Console.WriteLine($"Decompressing {compressedFile} using RAR format to {targetFile}");
    }
}

public class CompressionContext {
    private ICompressionStrategy _strategy;
    public CompressionContext(ICompressionStrategy strategy) {
        _strategy = strategy;
    }
    public void SetStrategy(ICompressionStrategy strategy) {
        _strategy = strategy;
    }

    public void Compress(string sourceFile, string compressedFile) {
        _strategy.Compress(sourceFile, compressedFile);
    }

    public void Decompress(string compressedFile, string targetFile) {
        _strategy.Decompress(compressedFile, targetFile);
    }
}

在该示例中,ICompressionStrategy是策略接口,它定义了Compress和Decompress方法。具体的策略实现类(ZipCompressionStrategy和RarCompressionStrategy)实现了该方法,并提供了不同的压缩和解压缩策略。CompressionContext是上下文对象,通过构造函数或者SetStrategy方法注入具体的策略实现对象,并在Compress和Decompress方法中使用该对象执行具体的压缩和解压缩操作。

策略模式的优点

策略模式具有以下优点:

  • 算法可以自由互换,策略模式符合“开闭原则”,可以很方便地新增、替换和删除算法实现类。
  • 策略模式消除了大量的条件语句,提高了代码的可读性和可维护性。
  • 策略模式将算法的实现从客户端代码中分离出来,降低了耦合度。

策略模式的缺点

策略模式比较容易产生过多的策略类,如果不加以控制会导致维护成本增加。同时,策略类会影响到程序的结构,需要在程序初始化时就将所有的策略类准备好,增加了程序的复杂度。

以上为策略模式的完整攻略和示例,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net行为型设计模式之策略模式(Stragety) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • mysql(5.6及以下)解析json的方法实例详解

    mysql(5.6及以下)解析json的方法实例详解 背景 在以往的开发中,我们通常使用MySQL来存储数据,然而在数据中存在着大量的json类型的数据,如何快速、便捷的解析json数据就变得尤为重要。本文将介绍Mysql(5.6及以下)中解析json类型数据的方法及实例。 操作步骤 使用JSON_EXTRACT()方法解析json数据 JSON_EXTRA…

    C 2023年5月23日
    00
  • C语言 数组

    C语言数组的使用攻略 数组的概念 在C语言中,数组(Array)是一种可存储多个相同类型数据的结构。数组中的每个元素可以通过下标(int)来唯一确定。数组下标从0开始,最大下标为数组长度-1。 数组的声明 在C语言中,声明数组需要指定数组的类型和长度。以下是一个数组的声明示例: int array[5]; // 声明一个长度为5的int类型数组 数组的初始化…

    C 2023年5月9日
    00
  • 当前标识没有对”Temporary ASP.NET Files”的写访问权限的解决办法

    如果您在使用ASP.NET应用程序时遇到了如下错误: Could not load file or assembly ‘WebApplication1’ or one of its dependencies. The system cannot find the file specified. Description: An unhandled except…

    C 2023年5月23日
    00
  • ubuntu 下编译C++代码出现的问题解决

    针对Ubuntu下编译C++代码出现的问题进行解决需要考虑以下几个步骤: 1.更新apt-get,确保系统软件包是最新的 sudo apt-get update sudo apt-get upgrade 2.安装C++编译器和构建工具 sudo apt-get install build-essential sudo apt-get install g++ …

    C 2023年5月23日
    00
  • jQuery使用getJSON方法获取json数据完整示例

    下面是关于”jQuery使用getJSON方法获取json数据完整示例”的完整攻略: 1. 简介 在Web开发中,经常需要使用Ajax技术从服务器获取数据并进行显示或其他操作。其中,获取的数据可能是JSON格式的数据,应对这种需求,jQuery提供了一个getJSON()方法来处理JSON数据。 2. getJSON()方法说明 方法语法 $.getJSON…

    C 2023年5月23日
    00
  • 数据库设计规范化的五个要求 推荐收藏

    数据库设计规范化是一项非常重要的工作,它能够确保数据库的稳定性和可靠性。下面介绍数据库设计规范化的五个要求及相应的推荐收藏。 一、满足第一范式(1NF) 第一范式中要求每个表中的每一列都是原子性的,即不可再分解。如果一个表中存在重复的数据,就需要将其拆分为多个表,每个表中都只包含单一属性。例如,考虑一个音乐播放平台,一个包含歌曲名、歌手和作曲家的表格: So…

    C 2023年5月22日
    00
  • PHP设计模式概论【概念、分类、原则等】

    PHP设计模式概论 概念 设计模式是指在面向对象编程中用于解决特定问题的重复使用的经验总结。设计模式不是一个可直接转换成代码的解决方案,而是定义了一组通用的原则和规范,它们可以用于设计任何系统。 分类 设计模式可以分为三类:创建型、结构型和行为型。 创建型模式 创建型模式主要用于对象的创建,包括“工厂模式”、“抽象工厂模式”、“单例模式”、“原型模式”、“建…

    C 2023年5月22日
    00
  • C语言结构体的全方面解读

    C语言结构体的全方面解读 什么是结构体? 结构体(Struct)是一种自定义数据类型,它可以存放不同类型的多个变量,可以理解为是多个变量的一种集合。通过定义结构体,可以让我们的程序更加高效、清晰。 结构体的定义方式 结构体定义方式如下: struct [结构体名称] { [数据类型1] [成员1]; [数据类型2] [成员2]; … [数据类型n] [成…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部