设计模式22——行为型模式之策略模式

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

类型:对象行为型模式。

概述:

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

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

类图:


参与者:

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

示例代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern22
{
    // 抽象算法类
    abstract class SortAlgo
    {
        //算法方法
        public abstract void Sort();
    }

    // 快速排序算法
    class QuickSort : SortAlgo
    {
        // 具体实现快速排序算法
        public override void Sort()
        {
            Console.WriteLine("快速排序算法实现");
        }
    }

    // 选择排序算法
    class SelectSort : SortAlgo
    {
        // 具体实现选择排序算法
        public override void Sort()
        {
            Console.WriteLine("选择排序算法实现");
        }
    }

    //上下文
    class Context
    {
        SortAlgo algo;

        public Context(SortAlgo _algo)
        {
            this.algo = _algo;
        }
        //上下文接口
        public void SortData()
        {
            algo.Sort();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Context context;

            // 当录入的是随机数据时,选择使用快速排序算法
            context = new Context(new QuickSort());
            context.SortData();

            // 当录入一些比较有顺序的数据时,使用选择排序算法
            context = new Context(new SelectSort());
            context.SortData();

            Console.Read();
        }
    }
}

适用性:

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

优缺点:

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

参考资料:

  1. 《设计模式——可复用面向对象软件基础》
  2. 《大话设计模式》


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值