设计模式之行为型模式---策略模式

一、策略模式的特点

在策略模式中我们定义一个基类Strategy作为公共的接口类,然后在下方不同的类通过继承实现同一个接口,实现不同的功能,这样做到在客户端可以调用统一个接口,根据不同的需求实现不同的功能。而Contex作为一个调配类根据客户指定的功能,调用实现这个功能的接口。

策略模式作用就是将实现功能的算法进行单独的封装,使用时可以相互替代其他的算法。

策略模式的优点:

1、可以在自己定义的算法之间自由的切换出来问题

2、易于扩展出来其他问题的算法

3、容易对每个算法进行修改由不会影响其他的算法对象。

二、策略模式的实现

1、策略模式的实现模型

2、策略模式的代码实现


 abstract class Strategy
{

 public abstract void AlgorithmInterface();
}


class ConcretesStrategyA : Strategy
{
    public override void AlgorithmInterface()
    {
        Console.WriteLine("实现了算法A");
    }
}

class ConcretesStrategyB : Strategy
{
    public override void AlgorithmInterface()
    {
        Console.WriteLine("实现了算法B");
    }
}

class ConcretesStrategyC : Strategy
{
    public override void AlgorithmInterface()
    {
        Console.WriteLine("实现了算法C");
    }
}

class Context
{
    Strategy strategy;

    public Context(Strategy strategy)
    {
        this.strategy = strategy;
    }

    public void ContextInterface()
    {
        strategy.AlgorithmInterface();
    }
}

class wMain
{
    static void Main()
    {
        Context context;
        context = new Context(new ConcretesStrategyA());
        context.ContextInterface();

        context = new Context(new ConcretesStrategyB());
        context.ContextInterface();

        context = new Context(new ConcretesStrategyC());
        context.ContextInterface();

        Console.Read();
    }
}

运行结果:

三、策略模式与工厂模式的结合

使用策略模式的时候还是需要由客户端指定创建那个对象,然后传递给策略模式,这样本身没有解决客户的判断压力,我们可以通过与工厂模式的结合来减轻客户的判断压力。客户端只需要知道需要实现那种功能,只需要将这种功能通知给策略适配器,而不必判断使用那个对象。

代码实现

using System;


 abstract class Strategy
{

 public abstract void AlgorithmInterface();
}


class ConcretesStrategyA : Strategy
{
    public override void AlgorithmInterface()
    {
        Console.WriteLine("实现了算法A");
    }
}

class ConcretesStrategyB : Strategy
{
    public override void AlgorithmInterface()
    {
        Console.WriteLine("实现了算法B");
    }
}

class ConcretesStrategyC : Strategy
{
    public override void AlgorithmInterface()
    {
        Console.WriteLine("实现了算法C");
    }
}

//改良的Contex
class ContextTool
{
    public Strategy strategy = null;
    public ContextTool(string type)
        {
        switch (type)
        {
            case "A":
                strategy = new ConcretesStrategyA();
                break;
            case "B":
                strategy = new ConcretesStrategyB();
                break;
            case "C":
                strategy = new ConcretesStrategyC();
                break;
            default:break;
        }    
        }

    public void ContextInterface()
    {
        strategy.AlgorithmInterface();
    }
}

class wMain
{
    static void Main()
    {
        ContextTool tools;
        tools = new ContextTool("A");
        tools.ContextInterface();

        tools = new ContextTool("B");
        tools.ContextInterface();

        tools = new ContextTool("C");
        tools.ContextInterface();

        Console.Read();
    }
}

运行结果 :

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值