zoukankan      html  css  js  c++  java
  • 设计模式系列19:策略模式(Stragety Pattern)

    定义

    定义一系列算法,将它们一个个封装起来,并且使它们可以互相替换,该模式使得算法可独立于使用它的客户而变化。    --《设计模式》GoF


    UML类图


    使用场景

    1. 一个系统有许多类,而区分它们的只是他们直接的行为时。
    2. 在有多种算法相似的情况下,使用if…else…所带来的复杂和难以维护。


    关键组成部分

    1,抽象策略角色(Strategy):定义公共接口,Context上下文使用这个接口调用不同的算法,一般使用接口实现(也可以使用抽象类)。

    2,具体策略角色(ConcreteStrategy):接口的实现,实现具体的算法。

    3,上下文角色(Context):维护一个策略对象的引用,并用定义允许策略访问其数据的接口。


    C#代码实现

    using System;
     
    namespace DoFactory.GangOfFour.Strategy.Structural
    {
      /// <summary>
    
      /// MainApp startup class for Structural
    
      /// Strategy Design Pattern.
    
      /// </summary>
    
      class MainApp
    
      {
        /// <summary>
    
        /// Entry point into console application.
    
        /// </summary>
    
        static void Main()
        {
          Context context;
     
          // Three contexts following different strategies
    
          context = new Context(new ConcreteStrategyA());
          context.ContextInterface();
     
          context = new Context(new ConcreteStrategyB());
          context.ContextInterface();
     
          // Wait for user
    
          Console.ReadKey();
        }
      }
     
      /// <summary>
    
      /// The 'Strategy' abstract class
    
      /// </summary>
    
      abstract class Strategy
    
      {
        public abstract void AlgorithmInterface();
      }
     
      /// <summary>
    
      /// A 'ConcreteStrategy' class
    
      /// </summary>
    
      class ConcreteStrategyA : Strategy
    
      {
        public override void AlgorithmInterface()
        {
          Console.WriteLine(
            "Called ConcreteStrategyA.AlgorithmInterface()");
        }
      }
     
      /// <summary>
    
      /// A 'ConcreteStrategy' class
    
      /// </summary>
    
      class ConcreteStrategyB : Strategy
    
      {
        public override void AlgorithmInterface()
        {
          Console.WriteLine(
            "Called ConcreteStrategyB.AlgorithmInterface()");
        }
      }
     
      /// <summary>
    
      /// The 'Context' class
    
      /// </summary>
    
      class Context
    
      {
        private Strategy _strategy;
     
        // Constructor
    
        public Context(Strategy strategy)
        {
          this._strategy = strategy;
        }
     
        public void ContextInterface()
        {
          _strategy.AlgorithmInterface();
        }
      }
    }

    运行结果:

    image

  • 相关阅读:
    存储过程
    C++学习总结
    Android快速开发系列 10个常用工具类
    SimpleHttpServer的学习之总体架构
    SimpleHttpServer的学习之UML
    SimpleHttpServer的学习(1)
    map用法
    idea 中resources下于java包名相同的包不能导入XML文件问题
    leetcode621
    Yukari's Birthday 枚举+二分 过程注意数据的溢出问题 HDU4430
  • 原文地址:https://www.cnblogs.com/mcgrady/p/10369976.html
Copyright © 2011-2022 走看看