战略形式属于行动型形式,它定义了一系列的算法,并将每个算法封装起来,而且使他们能够互相替代,让算法自力于运用它的客户而自力变化。
运用战略形式能够把行动和环境支解开来。环境类担任保持和查询行动类,种种算法则在细致战略类中供应。
角色:
1、笼统战略(Strategy)
这是一个笼统角色,一般由一个接口或笼统类完成。此角色给出一切的细致战略类所需的接口;
2、细致战略(Concrete Strategy)
完成笼统战略的细致战略类,包装了相干的算法或行动;
3、环境类(Context)
持有一个Strategy类的援用并能够依据逻辑挑选实例响应的战略。
示例:
定名空间StragetyPattern中包括战略基类Tax以及它的8个完成类,Context环境类持有战略基类。本示例经由过程一个文雅的体式格局来盘算个人所得税。
C#开辟笔记之04-如何用C#文雅的盘算个人所得税?
namespace StragetyPattern
public abstract class Tax { protected decimal TaxRate = 0; protected decimal QuickDeduction = 0; public virtual decimal Calculate(decimal income) { return income * TaxRate - QuickDeduction; } }
战略基类Tax,示意个人所得税,TaxRate为税率,QuickDeduction为速算扣除数,Calculate盘算响应收入的个人所得税。
public class Level0 : Tax { public Level0() { TaxRate = 0.00m; QuickDeduction = 0; } }
0级个人所得税门路,示意个人所得税的初始状况。
public class Level1 : Tax { public Level1() { TaxRate = 0.03m; QuickDeduction = 0; } }
1级个人所得税门路。
public class Level2 : Tax { public Level2() { TaxRate = 0.10m; QuickDeduction = 105; } }
2级个人所得税门路。
public class Level3 : Tax { public Level3() { TaxRate = 0.20m; QuickDeduction = 555; } }
3级个人所得税门路。
public class Level4 : Tax { public Level4() { TaxRate = 0.25m; QuickDeduction = 1005; } }
4级个人所得税门路。
public class Level5 : Tax { public Level5() { TaxRate = 0.30m; QuickDeduction = 2755; } }
5级个人所得税门路。
public class Level6 : Tax { public Level6() { TaxRate = 0.35m; QuickDeduction = 5505; } }
6级个人所得税门路。
public class Level7 : Tax { public Level7() { TaxRate = 0.45m; QuickDeduction = 13505; } }
7级个人所得税门路。
public class Context { private Tax _tax = null; private const decimal EXEMPTION_VALUE = 3500m; private List<decimal> _taxLevel = new List<decimal>{ 0, 1500, 4500, 9000, 35000, 55000, 80000, decimal.MaxValue }; private List<Type> _levels = new List<Type>(); private void GetLevels() { _levels = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(tp => tp.GetTypes() .Where(t => t.BaseType == typeof(Tax))) .ToList(); } public Context() { GetLevels(); } public Context Calculate(decimal income) { _tax = new Level0(); var result = income - EXEMPTION_VALUE; for(int i = 1; i <= _taxLevel.Count - 1; i++) { if(result > _taxLevel[i - 1] && result <= _taxLevel[i]) { _tax = (Tax)Activator.CreateInstance(_levels[i]); } } Console.WriteLine($"Income = {income}," + $"tax = {_tax.Calculate(result)}!"); return this; } }
环境类Context,起首须要保持对Tax的援用,EXEMPTION_VALUE示意免征额(本例运用3500元),以后经由过程反射和一些技能挑选响应的Tax完成类来盘算响应门路的个人所得税。
public class Program { private static Context _context = new Context(); public static void Main(string[] args) { _context.Calculate(2500.00m) .Calculate(4900.00m) .Calculate(5500.00m) .Calculate(7000.00m) .Calculate(10000.00m) .Calculate(16000.00m) .Calculate(43000.00m) .Calculate(70000.00m) .Calculate(100000.00m) .Calculate(4500.00m) .Calculate(1986.00m); Console.ReadKey(); } }
以上是挪用方的代码,Calculate经由特别处置惩罚以支撑要领链。以下是这个案例的输出效果:
Income = 2500.00,tax = 0.0000! Income = 4900.00,tax = 42.0000! Income = 5500.00,tax = 95.0000! Income = 7000.00,tax = 245.0000! Income = 10000.00,tax = 745.0000! Income = 16000.00,tax = 2120.0000! Income = 43000.00,tax = 9095.0000! Income = 70000.00,tax = 17770.0000! Income = 100000.00,tax = 29920.0000! Income = 4500.00,tax = 30.0000! Income = 1986.00,tax = 0.0000!
长处:
1、战略类的品级构造定义了一个算法或行动族,适当运用继续能够把大众的代码移到父类内里,从而防止反复的代码;
2、继续能够处置惩罚多种算法或行动,能够防止运用多重前提转移语句。
瑕玷:
1、客户端必需晓得一切的战略类,并自行决定运用哪个战略类;
2、战略形式形成很多的战略类,形成“子类爆炸”。
运用场景:
1、如果在一个体系内里有很多类,它们之间的区分仅在于它们的行动,那末运用战略形式能够动态地让一个对象在很多行动中挑选一种行动;
2、一个体系须要动态地在几种算法中挑选一种。
相干文章:
运用C/C++编写PHP Extension
【c#教程】C# 数据类型
相干视频:
什么是设想形式-php高等设想形式视频教程
以上就是深切明白C#设想形式之战略形式 角色细致案例分享的细致内容,更多请关注ki4网别的相干文章!