码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之策略模式

时间:2015-12-23 22:59:46      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:

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

技术分享

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

public interface Salary
    {
        int Caculator();
    }

接着实现具体的算法

public class ManagerSalary : Salary
    {
        public int Caculator()
        {
            return 1000;
        }
    }

    public class EmployeeSalary : Salary
    {
        public int Caculator()
        {
            return 800;
        }
    }

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

public class Employee
    {
        public Salary Salary {get;set;}
        public Employee(Salary salary)
        {
            Salary = salary;
        }
        public int GetSalary()
        {
            return Salary.Caculator();
        }
    }

最后看一下如何调用

static void Main(string[] args)
    {
        Employee employee = new Employee(new EmployeeSalary());
        Console.WriteLine("Employee salary is:{0}", employee.GetSalary().ToString());
        employee.Salary = new ManagerSalary();
        Console.WriteLine("Employee salary is:{0}", employee.GetSalary().ToString());

        Console.ReadLine();
    }

这篇内容来自网络的相关整理,感觉通俗易懂,与大家共同分享咯!

设计模式之策略模式

标签:

原文地址:http://www.cnblogs.com/wyh19941210/p/5071418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!