zoukankan      html  css  js  c++  java
  • 设计模式22——行为型模式之策略模式

    定义:策略模式(Strategy Pattern),定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户而变化。

    类型对象行为型模式。

    概述:

            策略模式是比较典型的对象行为型模式,它是将对处理对象的一系列不同算法都单独抽离出来,单独封装成一个个类。策略的出现,主要是为了解决不同算法替换时的逻辑判断,将逻辑判断移到Client中去。策略模式比较常见,但是也相对比较简单。

            一系列算法,作为程序员,很容易就想到排序算法。那这里就以排序算法来举例了。有文本内容Context,如果录得的是乱序数据,那么排序最好选择快速排序(Quick Sort);如果是多部分都有序,只有个别数据随意插入其中,那么此时可以使用选择排序(Select Sort)

    类图:


    参与者:

    1. Context,上下文,维护一个指向SortAlgo的指针,用来访问相应的排序算法。
    2. SortAlgo,算法策略接口类,只是提供接口。
    3. QuickSortSelectSort,按照接口实现具体的算法。

    示例代码:

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <strong>using System;  
    2. using System.Collections.Generic;  
    3. using System.Text;  
    4.   
    5. namespace Pattern22  
    6. {  
    7.     // 抽象算法类  
    8.     abstract class SortAlgo  
    9.     {  
    10.         //算法方法  
    11.         public abstract void Sort();  
    12.     }  
    13.   
    14.     // 快速排序算法  
    15.     class QuickSort : SortAlgo  
    16.     {  
    17.         // 具体实现快速排序算法  
    18.         public override void Sort()  
    19.         {  
    20.             Console.WriteLine("快速排序算法实现");  
    21.         }  
    22.     }  
    23.   
    24.     // 选择排序算法  
    25.     class SelectSort : SortAlgo  
    26.     {  
    27.         // 具体实现选择排序算法  
    28.         public override void Sort()  
    29.         {  
    30.             Console.WriteLine("选择排序算法实现");  
    31.         }  
    32.     }  
    33.   
    34.     //上下文  
    35.     class Context  
    36.     {  
    37.         SortAlgo algo;  
    38.   
    39.         public Context(SortAlgo _algo)  
    40.         {  
    41.             this.algo = _algo;  
    42.         }  
    43.         //上下文接口  
    44.         public void SortData()  
    45.         {  
    46.             algo.Sort();  
    47.         }  
    48.     }  
    49.   
    50.     class Program  
    51.     {  
    52.         static void Main(string[] args)  
    53.         {  
    54.             Context context;  
    55.   
    56.             // 当录入的是随机数据时,选择使用快速排序算法  
    57.             context = new Context(new QuickSort());  
    58.             context.SortData();  
    59.   
    60.             // 当录入一些比较有顺序的数据时,使用选择排序算法  
    61.             context = new Context(new SelectSort());  
    62.             context.SortData();  
    63.   
    64.             Console.Read();  
    65.         }  
    66.     }  
    67. }  
    68. </strong>  

    适用性:

    1. 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
    2. 在需要新添加其他算法来实现时。
    3. 对客户端隐藏具体算法的实现细节。

    优缺点:

    1. 优点,将判断的逻辑移到类外面,方便通过添加新类来完成新的算法。
    2. 缺点,如果算法类过多,会对Client端调用不同算法的判断带来麻烦。

    参考资料:

      1. 《设计模式——可复用面向对象软件基础》
      2. 《大话设计模式》
  • 相关阅读:
    flask的类视图
    flask的消息提示flash和abort
    css—left和margin-left的区别
    Git(2)—特性
    JS 基础
    css
    搭建vue环境
    Git(1)—基础
    C中 输出格式
    软件测试_对于堆栈的单元测试
  • 原文地址:https://www.cnblogs.com/feihe0755/p/3619857.html
Copyright © 2011-2022 走看看