【C#设计模式-策略者模式】

一.策略者模式定义:

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

二. 策略者模式的组成:

抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

具体策略角色:包装了相关的算法和行为。

环境角色:持有一个策略类的引用,最终给客户端调用。

三.策略者模式的实现:

在现实生活中,针对员工的收入情况,会收取个人所得税,公司所得税等等,针对这些所得税都有对于的算法进行计算,如果不采用策略模式,可能会建一个计算类,里面包含着许多计算方法,然后提供一个判断,在什么情况去调用算法,如果在未来增加了新的算法,就需要去修改判断,这样违背开放封闭的原则,考虑使用策略者模式会更好的扩展,管理算法,简化了逻辑处理。

    /// <summary>
    /// 计算税收策略
    /// </summary>
    public interface ITaxStragety
    {
        /// <summary>
        /// 算法
        /// </summary>
        /// <param name="income">收入</param>
        /// <returns></returns>
        double CalculateTax(double income);
    }
    /// <summary>
    /// 个人所得税
    /// </summary>
    public class PersonalTaxStrategy:ITaxStragety
    {
        /// <summary>
        /// 个人所得税算法
        /// </summary>
        /// <param name="income"></param>
        /// <returns></returns>
        public double CalculateTax(double income)
        {
            return income * 0.12;
        }
    }
    /// <summary>
    /// 企业所得税
    /// </summary>
    public class EnterpriseTaxStrategy:ITaxStragety
    {
        /// <summary>
        /// 企业所得税算法
        /// </summary>
        /// <param name="income"></param>
        /// <returns></returns>
        public double CalculateTax(double income)
        {
            return (income - 3500) > 0 ? (income - 3500) * 0.045 : 0;
        }
    }
    /// <summary>
    /// 环境角色(Context):持有一个Strategy类的引用
    /// </summary>
    public class InterestOperation
    {
        private ITaxStragety strtegy { get; set; }
        public InterestOperation(ITaxStragety strtegy)
        {
            this.strtegy = strtegy;
        }
        public double GetCalc(double income)
        {
            return strtegy.CalculateTax(income);
        }
    }
    /// <summary>
    /// C#设计模式-策略者模式
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            double gz = 3500;
            //个人所得税收计算方式
            InterestOperation operatio = new InterestOperation(new PersonalTaxStrategy());
            Console.WriteLine("个人所得税{0}", operatio.GetCalc(gz));

            //企业所得税收计算方式
            operatio = new InterestOperation(new EnterpriseTaxStrategy());
            Console.WriteLine("企业所得税{0}", operatio.GetCalc(gz));
        }
    }

使用策略者模式,以后再需要增加新的算法的时候,只需要继承自ITaxStragety接口,实现里面的计算方法即可,这样就遵循了设计原则中的对扩展开发,对修改关闭,同时更好的管理算法,简单明了,避免了逻辑处理方面的紊乱。

四.优缺点:

优点:

1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。

2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。

3、 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

缺点:

1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

时间: 2024-07-30 00:10:09

【C#设计模式-策略者模式】的相关文章

设计模式-策略者模式

一.定义 策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 二.UML类图 三.例子展示 namespace 策略者模式 { public interface ITaxStrategy { double GetTax(double money); } public class PersnalStrategy : ITaxStrategy { public double GetTax(double mo

C#设计模式-策略者模式(Strategy)

策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以互换." 模式涉及到三个角色: 1.环境(Context)角色:持有一个Strategy类的引用.

设计模式 - 策略模式(Strategy Pattern) 具体解释

策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全部, 禁止转载, 如有须要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式; 使用set()方法

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权所有, 禁止转载, 如有需要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法,

【原】设计模式-策略模式(Strategy Model)

1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有时需要把年龄做为比较的标准,或者有时又想将身高作为比较的标准,不同的比较标准也就衍生出了统一个比较目的的不同算法实现,在搜索问题中也是类似,有可能用到二分查找.顺序查找之类.通常较简单直接的思维便是将所有的算法(策略)写成一个类的方法,再通过客户端去调用:也可一将所有的算法全部封装在一个方法中用一堆的if...el

跟我学设计模式视频教程——命令模式vs策略模式,唠嗑

课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--命令模式vs策略模式,唠嗑,布布扣,bubuko.com

2.大话设计模式-策略模式

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <summary> 10 /// 策略模式 11 /// </summary> 12 public class TacticsModel 13 { 14 //对于

C++设计模式实现--策略(Strategy)模式

一. 举例说明 以前做了一个程序,程序的功能是评价几种加密算法时间,程序的使用操作不怎么变,变的是选用各种算法. 结构如下: Algorithm:抽象类,提供算法的公共接口. RSA_Algorithm:具体的RSA算法. DES_Algorithm:具体的DES算法. BASE64_Algorithm:具体的Base64算法. 在使用过程中,我只需要对外公布Algorithm_Context这个类及接口即可. 代码实现: [cpp] view plaincopy //策略类 class Alg

设计模式系列二(策略者模式)

浑浑噩噩的过的漫无目的,更多的是迷茫,真不知该如何定位自己的人生?空有远大抱负,而又力不从心!有句话说的好,当你的才能撑不起你的野心的时候,就该静下来心来好好学习了!于是闲来无事,便继续开始我的设计模式之游!今天便研究下策略者模式! 1.策略者模式解析 大话设计模式是这样讲道: 策略者模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法减少各种算法类与使用算法类之间的耦合[DPE]. 个人理解:所谓一系列算法方法就是一系列