大话设计模式之策略模式-阿里云开发者社区

开发者社区> 丁国华> 正文

大话设计模式之策略模式

简介:         打开百度,搜索“策略”二字,她给你这样的答案:a、可以实现目标的方案集合;b、根据形势发展而制定的行动方针和斗争方法;c、 有斗争艺术,能注意方式方法;d、 计谋,谋略。
+关注继续查看

        打开百度,搜索“策略”二字,她给你这样的答案:a、可以实现目标的方案集合;b、根据形势发展而制定的行动方针和斗争方法;c、 有斗争艺术,能注意方式方法;d、 计谋,谋略。e、在作当前决策时即将未来的决策考虑在内的一种计划。接着,我们开始搜索“模式”二字,不负众望,她同样给你一个反馈信息:模式是指从生产经验和生活经验中经过抽象和升华提炼出来的核心知识体系。模式(Pattern)其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果,而且会得到解决问题的最佳办法。

        接下来,进入到我们今天的主题,“策略模式”---是一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

         我们来看看策略模式的结构图:

         

        对上述结构图进行简单的解释说明:

        a、将所有的算法都抽象成了Strategy,可以将算法分离出来并且进行更换。
        b、Context 中含有对Strategy的引用。
        c、通过contextInterface(),进行对算法的使用。

         从上面的结构图中,可以看出这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。换句话说,策略模式并不将算法固定在具体的某个类中,而是将算法独立出来,可根据需要替换算法。例如:Context中含有对 Straategy的引用。这里还用到了依赖倒转和里斯代换原则,即Context依赖于抽象,而没有依赖具体的子类,并且,子类可以替换父类。

        下面我们从策略模式的代码来看,它是如何实现的:
        首先,定义一个抽象类(Strategy),作为所有具体算法的公共接口:

         

[csharp] view plaincopyprint?
namespace ConsoleApplication1  
   abstract class Strategy         //将算法抽象成 Stragedy    
        {  
           public override void AlgorithmInterface();       //算法方法  
        }  
            其次,定义具体的算法或行为,继承于Strategy:

             

[csharp] view plaincopyprint?
class concreteStrategy : Strategy               // 定义一个具体算法    
       {  
           public override void AlgorithmInterface()                //算法的实现方法  
        {  
            Console.WriteLine("算法实现");  
        }  
       }  
          最后,定义Context对象,通过其ContextInterface(),为其分配不同的算法。

           

[csharp] view plaincopyprint?
class Context                   // 将算法封装到Context中,通过传递对象生成相应子类对象,得到结果  
 {  
       Strategy strategy;                //Context 中含有 Strategy的引用  
  
       public Context(Strategy strategy)    //初始化时,传入具体的Strategy 对象  
       {  
           this.strategy = strategy;  
  
       }  
       public void ContextInterface()       //根据传入的对象,调用Context 的ContextInterface 方法  
       {  
           strategy.AlgorithmInterface();  
       }  
          客户端代码:实例化策略。

           

[csharp] view plaincopyprint?
<span style="white-space:pre">  </span>static void Main(string[] args)  
        {  
            {  
                Context context;  
                context = new Context(new concreteStrategy());  
                context.ContextInterface();  
  
                Console.Read();  
            }  

          策略模式是一种常见和常用的设计模式,策略的独立和抽象。常见的场景比如每逢元旦的时候,元辰超市举办特价活动,每次到结账的时候,她都会问你,有会员卡么?因为可以随着用户类型的不同,打折的策略也不同。初次接触策略模式,浅浅的理解,就是兵来将挡,水来土掩;上有政策,下有对策;呼呼,也不知道这种傻傻的理解到底对不对,但是我总会慢慢的理解,慢慢的深入,设计之旅,未完待续......


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
设计模式之策略模式
策略模式即设计不同的策略应用于不同的实现上。 代码实现如下: //动物 public abstract class Animal { private Behavior behavior;//让animal和b...
591 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
4068 0
设计模式(二十二) 策略模式
有时候对象需要按照某种策略改变行为,我们可以利用策略模式,将策略或算法提取出来,作为单独的类实现。使用策略模式,可以让具体算法和应用对象分离,方便的根据不同条件替换策略。
595 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4487 0
【Java设计模式】策略模式
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景知识    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。策略模式将不同的算法封装起来,根据客户端的需求,调用不同的对象使用不同的算法,节省了大
3989 0
+关注
丁国华
你只管努力,剩下的交给时光!
214
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载