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

yizhihongxing

.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日

相关文章

  • 深入解读C语言中的符号常量EOF

    关于“深入解读C语言中的符号常量EOF”的完整攻略,我会包含以下内容: 1. 什么是EOF EOF的全称是End Of File (文件结束符),是C语言标准库中定义的一个符号常量,其值为-1。根据C语言标准定义,EOF使用宏定义实现,其定义在stdlib.h或stdio.h头文件中。 EOF是一个特殊的,无格式字符,通常用于标识文件结束的位置。当读取文件时…

    C 2023年5月23日
    00
  • N点虚拟主机管理系统出现错误代码-100001的解决方法

    N点虚拟主机管理系统出现错误代码-100001的解决方法 问题描述 在使用N点虚拟主机管理系统时,用户可能会遇到错误代码-100001,这通常是由于N点虚拟主机管理系统的一些配置问题引起的。 解决方法 1. 检查配置文件 首先,您需要检查配置文件,确保所有必要的参数设置正确。如果配置文件中存在错误或缺失,可能会导致错误代码-100001的出现。按照以下步骤进…

    C 2023年5月22日
    00
  • JS对象序列化成json数据和json数据转化为JS对象的代码

    一、JS对象序列化成JSON数据 JS对象序列化成JSON数据的方法是使用JSON.stringify()函数,将JS对象转换成json字符串。 举个例子,如果我们有以下的JS对象: let person = { name: ‘Alice’, age: 20, gender: ‘female’ } 我们可以将它序列化成JSON数据: let jsonStr …

    C 2023年5月23日
    00
  • 基于C语言实现学生成绩管理系统

    基于C语言实现学生成绩管理系统完整攻略 1. 掌握C语言基础 要实现学生成绩管理系统,首先需要掌握C语言的基础知识,包括控制流、函数、数组、结构体、指针等等。 2. 设计数据结构 根据学生成绩管理系统的需求,设计合适的数据结构来存储学生信息和成绩。可以使用结构体来存储学生信息,包括学号、姓名、性别、年龄等等;使用数组来存储学生成绩,每个元素代表一个学生的成绩…

    C 2023年5月23日
    00
  • C++设计一个简单内存池的全过程

    下面我将详细讲解C++设计一个简单内存池的全过程。 概述 内存池是为了提高内存分配与释放效率而提出的一种技术。一般情况下,内存池会提前分配一定的内存,并将分配出的内存按照一定的规则进行管理。当需要内存时,内存池会从已经预分配的内存中寻找可以使用的内存块。当不需要使用某个内存块时,该内存块会被归还给内存池进行管理。 下面我们将按照以下步骤设计简单的内存池。 步…

    C 2023年5月23日
    00
  • 关于Fragment already added问题的解决方案

    关于 Fragment already added 问题的解决方案一般有以下几种: 方案一:使用findFragmentByTag 在Activity中使用FragmentManager的findFragmentByTag()方法来查找Fragment是否已经被添加。如果已经添加,则不需要重复添加,避免出现Fragment already added异常。 …

    C 2023年5月23日
    00
  • C语言代码实现猜数字游戏

    下面是C语言代码实现猜数字游戏的完整攻略。 1. 题目要求 猜数字游戏是一款非常简单的游戏,游戏的规则如下: 程序会随机生成一个数字,数字的范围为1-100; 玩家可以输入一个数字,程序会告诉玩家这个数字是正确的、偏大还是偏小; 如果玩家猜对了数字,游戏结束,否则会提示玩家再次输入数字继续猜。 我们要在C语言中实现这个游戏。 2. 代码实现 代码实现分为以下…

    C 2023年5月22日
    00
  • 逍遥自在学C语言 | 位运算符&的高级用法

    前言 在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、位掩码 位掩码是一种用于按位操作的技术 它通过使用一个二进制数(掩码)来屏蔽或保留目标数中的一些特定位 例…

    C语言 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部