C#设计模式:策略者模式(Stragety Pattern)

一,什么是策略模式?

1,针对同一命令或行为,不同的策略做不同的动作。

2,比如针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

二,如下代码

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

namespace _19.策略模式
{
    /// <summary>
    /// 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象负责。
    /// 策略模式通常把一系列的算法包装到一系列的策略类里面。
    /// 用一句话慨括策略模式就是——“将每个算法封装到不同的策略类中,使得它们可以互换”。
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("输入第一个数字(整数):");
                string type = Console.ReadLine();
                int iType = 0;
                if (!int.TryParse(type, out iType))
                {
                    Console.WriteLine("输入数字无效,请重新输入");
                    continue;
                }
                ///策略的调用
                StrategyContext context = new StrategyContext();
                context.SetStrategy(StrategyFortory.CreateInstance((StrategyType)iType));
                context.Setup();
            }
        }
    }
    /// <summary>
    /// 使用工厂模式管理策略
    /// </summary>
    public class StrategyFortory
    {
        public static AbstractStrategy CreateInstance(StrategyType type)
        {
            AbstractStrategy abstractStrategy = null;
            switch (type)
            {
                case StrategyType.Chinese:
                    abstractStrategy = new ChineseStrategy();
                    break;
                case StrategyType.Usa:
                    abstractStrategy = new UsaStrategy();
                    break;
            }
            return abstractStrategy;
        }
    }
    /// <summary>
    /// 抽象策略
    /// </summary>
    public abstract class AbstractStrategy
    {
        public abstract void Setup();
    }
    /// <summary>
    /// 具体策略
    /// </summary>
    public class ChineseStrategy : AbstractStrategy
    {
        public override void Setup()
        {
            Console.WriteLine("中国人");
        }
    }
    /// <summary>
    /// 具体策略
    /// </summary>
    public class UsaStrategy : AbstractStrategy
    {
        public override void Setup()
        {
            Console.WriteLine("美国人");
        }
    }
    /// <summary>
    /// 策略的使用
    /// </summary>
    public class StrategyContext
    {
        AbstractStrategy strategy = null;
        public void SetStrategy(AbstractStrategy strategy)
        {
            this.strategy = strategy;
        }
        public void Setup()
        {
            this.strategy.Setup();
        }
    }
    /// <summary>
    /// 策略枚举
    /// </summary>
    public enum StrategyType
    {
        Chinese = 0,
        Usa = 1
    }
}

 

posted @ 2018-01-08 17:20  叶丶梓轩  阅读(348)  评论(0编辑  收藏  举报