zoukankan      html  css  js  c++  java
  • C#设计模式——策略模式(Strategy Pattern)

    一、概述
    我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句。如果该企业中不同级别的员工过多,或是对级别的调整比较频繁,那该系统就会显得复杂而脆弱。如何能将对象和算法解耦,从而使得在系统运行时能透明的改变对象的算法呢?这就到了策略模式大显身手的时候了。
    二、策略模式
    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换。该模式可使得算法能独立于使用它的客户而变化。
    策略模式的结构图如下:

    Context代表需要改变算法的那个对象,它维护了一个对Strategy对象的引用,可以定义一个接口允许Strategy对象来访问它的数据。
    Strategy定义了所支持算法的公共接口,Context通过这个接口来调用ConcreteStrategy定义的算法。
    ConcreteStrategy实现了具体的算法。
    三、示例
    下面我们使用策略模式来实现本文开头提到的企业工资系统。
    首先定义算法的公共接口

    1     public interface Salary
    2 {
    3 int Caculator();
    4 }

    接着实现具体的算法

    复制代码
     1     public class ManagerSalary : Salary
    2 {
    3 public int Caculator()
    4 {
    5 return 1000;
    6 }
    7 }
    8
    9 public class EmployeeSalary : Salary
    10 {
    11 public int Caculator()
    12 {
    13 return 800;
    14 }
    15 }
    复制代码

    然后定义那个需要动态改变算法的对象

    复制代码
     1     public class Employee
    2 {
    3 public Salary Salary {get;set;}
    4 public Employee(Salary salary)
    5 {
    6 Salary = salary;
    7 }
    8 public int GetSalary()
    9 {
    10 return Salary.Caculator();
    11 }
    12 }
    复制代码

    最后看一下如何调用

    复制代码
    1     static void Main(string[] args)
    2 {
    3 Employee employee = new Employee(new EmployeeSalary());
    4 Console.WriteLine("Employee salary is:{0}", employee.GetSalary().ToString());
    5 employee.Salary = new ManagerSalary();
    6 Console.WriteLine("Employee salary is:{0}", employee.GetSalary().ToString());
    7
    8 Console.ReadLine();
    9 }
    复制代码
     
  • 相关阅读:
    在R语言中轻松创建关联网络
    在R语言中显示美丽的数据摘要summary统计信息
    R语言中不同类型的聚类方法比较
    R语言中的划分聚类模型
    R语言解释生存分析中危险率和风险率的变化
    Stata估算观测数据的风险比
    Stata 中Mata的st_view函数
    R语言多臂试验
    R语言使用倾向评分提高RCT(随机对照试验)的效率
    R语言在RCT中调整基线时对错误指定的稳健性
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/6007872.html
Copyright © 2011-2022 走看看