大话设计模式之策略模式

简介:         打开百度,搜索“策略”二字,她给你这样的答案: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();  
            }  

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


目录
相关文章
|
3月前
|
设计模式 算法 测试技术
PHP中的设计模式:策略模式的应用与实践
在软件开发的浩瀚海洋中,设计模式如同灯塔,指引着开发者们避开重复造轮子的暗礁,驶向高效、可维护的代码彼岸。今天,我们将聚焦于PHP领域中的一种重要设计模式——策略模式,探讨其原理、应用及最佳实践,揭示如何通过策略模式赋予PHP应用灵活多变的业务逻辑处理能力,让代码之美在策略的变换中熠熠生辉。
|
2天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
18 1
|
6天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
15 2
|
20天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
43 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
32 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
29 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
64 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
27 3
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
30 1
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
29 2

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    54
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    46
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    52
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    62
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    41
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    65
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    60
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    51
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    114
  • 下一篇
    无影云桌面