zoukankan      html  css  js  c++  java
  • C# 设计模式策略者模式(Strategy)

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

    策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以互换。"

    模式涉及到三个角色:

    1、环境(Context)角色:持有一个Strategy类的引用。

    2、抽象策略(ICommunication)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

    3、具体策略(Serial、Lan)角色:包装了相关的算法或行为。

    直接看例子:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Timers;
    
    namespace Demo
    {
        public interface ICommunication
        {
            bool Send(object data);
        }
    
        public class Serial:ICommunication
        {
            public bool Send(object data)
            {
                Console.WriteLine("通过串口发送一个数据的算法");
                return true;
            }
        }
    
        public class Lan:ICommunication
        {
            public bool Send(object data)
            {
                Console.WriteLine("通过网口发送一个数据的算法");
                return true;
            }
        }
    
        public class Context
        {
            private ICommunication _communication;
            public void SetStrategy(ICommunication communication)//传递具体的策略
            {
                this._communication = communication;
            }
            public bool Send(object data)
            {
                return this._communication.Send(data);
            }
        }
    
    
        class Program
        {  
            static void Main(string[] args)
            {
                Console.WriteLine("请输入通信类型:Lan、Serial");
                string input = Console.ReadLine();
                object data = new object();
                Context ct = new Context();
                if (input.Equals("Lan"))  //通过客户端的选择,来确定具体用哪种通信算法
                {
                    ct.SetStrategy(new Lan());
                }
                else
                {
                    ct.SetStrategy(new Serial());
                }
                ct.Send(data);
                Console.ReadKey();  
            }
        }
    }

    运行结果:

    截图20160127134549157

    从上面的例子可以看出,Strategy与Factory模式很类似,但Factory在创建时改变对象,而Strategy模式可自由切换。

    Strategy模式可用于封装较差却易于实现的解决方案,也可以封装较好却难以实现的解决方案。可首先实现较差却易于实现的解决方案,,然后用这个较差方案进行测试,利用该模式可在后期实现较好的方案,且不必更改调用算法的方案。

    策略模式的缺点有:

    1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

    2. 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

  • 相关阅读:
    Android进程的优先级说明
    Android的有序广播和无序广播(解决安卓8.0版本之后有序广播的接收问题)
    Android开发中常用Dialog(普通弹窗&时间选择器&日历选择器)
    Android的显示意图和隐式意图总结
    Android的启动模式
    怎么评论一段php语言文本单词one-hot编码的健壮性
    python 基础知识,解决模板引擎实现原理流程
    SQL----EXISTS 关键字EXISTS基本意思
    omcat启动Publishing failed with multiple errors
    AngularJs directive详解及示例代码
  • 原文地址:https://www.cnblogs.com/sunqiliang/p/5163058.html
Copyright © 2011-2022 走看看