zoukankan      html  css  js  c++  java
  • C#-设计模式-策略模式

    1.定义

    将会经常改变的算法,封装在接口中,在算法更改时,只需要为接口添加新的实现,而不需要修改原有的算法。

    2.代码实现

    public interface Calculatable
    {
        decimal GetResult(decimal num1, decimal num2);
    }
    
    public class Add : Calculatable
    {
        public decimal GetResult(decimal num1, decimal num2)
        {
            return num1 + num2;
        }
    }
    
    public class Reduce : Calculatable
    {
        public decimal GetResult(decimal num1, decimal num2)
        {
            return num1 - num2;
        }
    }
    
    public class Multiplication : Calculatable
    {
        public decimal GetResult(decimal num1, decimal num2)
        {
            return num1 * num2;
        }
    }
    
    public class Division : Calculatable
    {
        public decimal GetResult(decimal num1, decimal num2)
        {
            if (num2 == 0) return 0;
            return num1 / num2;
        }
    }

    由一个计算接口,派生出4个运算类,分别是加减乘除,调用的时候;

    Calculatable cal = new Add();
    cal.GetResult(1, 2);

    当需要更换算法的时候只需要将接口的实现换成另一个算法类即可,如果使用IOC,还可以将实现放到配置文件中,起到动态更换算法的功能。

    3.特点

    优点:将算法的变化进行抽离和封装,因此当算法更换时,不需要更改代码,只需要对接口进行新的实现就行了

    缺点:如果算法比较多的时候,策略类(实现策略接口的类)就会比较多,而且比较坑爹的是,每一个策略类中只有一个public方法,比较浪费

    如果优化的话,可以使用抽象类,将变化的算法设为抽象方法,或虚方法,这样让子类对该方法进行实现即可,同样可以实现该需求,而且代码重用性应该会更好

  • 相关阅读:
    分享:两个栈实现一个队列的功能
    分享:要关注技术,但也要关注所做的事情
    linux网络编程中阻塞和非阻塞socket的区别
    分享:C++参数传递方式
    linux非阻塞socket教程
    有用和有趣的产品秤砣
    查找 grep r TFramedTransport *
    分享:SecureCRT使用VIM语法高亮
    linux 非阻塞 socket Google 搜索
    linux c语言 select函数用法 ITeye技术网站
  • 原文地址:https://www.cnblogs.com/gamov/p/10523357.html
Copyright © 2011-2022 走看看