`
pcajax
  • 浏览: 2200884 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

策略模式介绍

 
阅读更多

 2.1 什么是策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

 

2.2  策略模式包含角色

—抽象策略角色(strategy): 策略类,通常由一个接口或者抽象类实现。
—具体策略角色(ConcreteStrategy):包装了相关的算法和行为。
—环境角色(Context):持有一个策略类的引用,最终给客户端调用
 
 
2.3 策略模式UML图
 Strategy为抽象类或接口 定义算法方法,然后由ConcreteStategyA来实现具体的算法,而Context维护着Strategy的实例根据客户端来决定调用哪个子类的方法。
 
 
 
 

三 策略模式代码 

 
 
   抽象策略类定义公共的方法 
复制代码
    /// <summary>
    /// 抽象策略类
    /// 此抽象类提供统一接口或抽象方法 
    /// </summary>
    abstract class Strategy
    {
        public abstract void PrintName();
    }
复制代码

 

具体算法类也可以说是 具体策略类 主要是对算法的具体实现 

复制代码
    /// <summary>
    /// 具体算法实现类
    /// </summary>
    class ConcreteStrategyA:Strategy
    {
        public override void PrintName()
        {
            Console.WriteLine("这是具体策略类A");
        }
    }
    class ConcreteStrategyB:Strategy
    {
      public override void PrintName()
        {
            Console.WriteLine("这是具体策略类B");
        }
    }
    class ConcreteStrategyC:Strategy
    {
        public override void PrintName()
        {
            Console.WriteLine("这是具体策略类C");
        }
    }
复制代码

 

Context类维护一个Strategy的实例与Strategy之间交互和数据传递

复制代码
   /// <summary>
   /// Context 对象 维护对Strategy对象的引用
   /// </summary>
    class StrategyContent
    {
        private Strategy _strategy;

        public StrategyContent(Strategy strategy)
        {
            this._strategy = strategy;
        }

        public void PrintStrategryMethod()
        {
            _strategy.PrintName();
        }
}
复制代码

 

 

客户端类

复制代码
    /// <summary>
    /// Client 
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //将具体类的实例传入Context中
            StrategyContent a = new StrategyContent(new ConcreteStrategyA());
            StrategyContent b = new StrategyContent(new ConcreteStrategyB());
            StrategyContent c = new StrategyContent(new ConcreteStrategyC());
            a.PrintStrategryMethod();
            b.PrintStrategryMethod();
            c.PrintStrategryMethod();
            Console.Read();
        }
    }
复制代码

 

结果如下:

 

 

进一步优化

策略模式写完后会发现,判断用哪个实例的逻辑又回到客户端去了,对于变化我们提倡要进行封装,那怎么处理呢 答案就是 把简单工厂与策略模式结合

只要修改如下两个类即可

1 Context类  注释部分为原来写法

复制代码
   /// <summary>
   /// Context 对象 维护对Strategy对象的引用
   /// </summary>
    class StrategyContent
    {
         Strategy _strategy;
        //public StrategyContent(Strategy strategy)
        //{
        //    this._strategy = strategy;
        //}

        //用工厂模式处理
        public StrategyContent(string type)
       {
           switch (type)
           {
               case "A":
                  _strategy = new ConcreteStrategyA();
                   break;
               case "B":
                   _strategy = new ConcreteStrategyB();
                   break;
               case "C":
                   _strategy = new ConcreteStrategyC();
                   break;
           }
        }

        public void PrintStrategryMethod()
        {
            _strategy.PrintName();
        }
    }
复制代码

 

2 客户端类 用了简单工厂后已经把判断的逻辑封装到了工厂类中,所以客户端中不再有判断的逻辑, 也就符合了面向对象中的 封装变化 特征。

复制代码
    /// <summary>
    /// Client 
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //将具体类的实例传入Context中
            //StrategyContent a = new StrategyContent(new ConcreteStrategyA());
            //StrategyContent b = new StrategyContent(new ConcreteStrategyB());
            //StrategyContent c = new StrategyContent(new ConcreteStrategyC());
            //a.PrintStrategryMethod();
            //b.PrintStrategryMethod();
            //c.PrintStrategryMethod();
            Console.Write("输入A,B,C\r\n");
            string result = Console.ReadLine();
            StrategyContent instance = new StrategyContent(result);
            instance.PrintStrategryMethod();
            Console.Read();
        }
    }
复制代码

结果如下

 

 

四 总结

 
  设计模式 先熟悉 再熟练 最后灵活运用!
分享到:
评论

相关推荐

    详解SpringBoot结合策略模式实战套路

    在本文中,我们将详细介绍如何使用策略模式在SpringBoot项目中实现业务逻辑处理。 策略模式的定义 策略模式是一种行为设计模式,它允许开发者定义一些策略族,分别封装起来,每一个策略中的算法具有一定的独立性,...

    策略模式的实现,通过反射

    本示例将详细介绍如何通过两种方法实现策略模式:一种是通过Map存储方式,另一种是通过配置文件加反射方式。 首先,我们理解策略模式的基本结构。策略模式包含三个主要角色:策略接口(Context)、具体策略类...

    设计模式之禅之 工厂方法模式+策略模式

    《设计模式之禅》第35章介绍了工厂方法模式与策略模式的结合运用,旨在通过一个具体的案例——“一卡通”交易系统的设计,来展现如何在实际项目中灵活运用这两种设计模式,以达到代码的可扩展性和易维护性。...

    策略模式的简单例子

    在《Head First设计模式》这本书中,第一章通过一个鸭子的例子来介绍策略模式。这个例子中,有各种各样的鸭子(例如:红头鸭、橡皮鸭等),每种鸭子的行为(如叫声、游泳、飞)可能会有所不同。这些不同的行为可以...

    HeadFirst策略模式

    《HeadFirst策略模式》是设计模式领域的一本经典著作,其第一章主要介绍了策略模式的基本概念、原理以及在C++中的具体实现。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式允许我们用不同的...

    策略设计模式简单代码实现

    在Head First设计模式这本书中,作者用生动易懂的方式介绍了策略模式,包括鸭子的例子,帮助读者更好地理解和应用这种模式到实际项目中。通过分析压缩包中的"Duck"文件,你可以进一步了解这个模式在具体代码中的实现...

    设计模式-策略者

    在《设计模式-策略者》这篇文章中,作者深入浅出地介绍了策略模式的基本概念、结构和实现方式。文章可能涵盖了以下几个关键知识点: 1. **模式定义**:策略模式允许在运行时选择不同的算法或策略,提供了一种用面向...

    SpringBoot+策略模式 实现多种文件存储方式

    在这个项目中,我们将深入探讨如何利用Spring Boot和策略模式来实现多种文件存储方式,包括本地存储和MinIO云存储,并介绍如何设计一个可自定义扩展的架构。 ### Spring Boot简介 Spring Boot的核心优势在于其...

    设计模式策略模式demo

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据...

    HeadFirst 设计模式学习笔记1--策略模式Demo

    在HeadFirst的《设计模式》一书中,作者以通俗易懂的方式介绍了各种设计模式,包括策略模式,适合初学者和有经验的开发者深入理解设计模式的原理和应用。通过阅读这本书,我们可以更好地掌握如何在实际项目中灵活...

    Head first 设计模式 第一章 策略模式 pdf + 源代码

    第一章重点介绍了策略模式,这是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户。 策略模式的...

    JAVA设计模式

    策略模式介绍 策略模式是一种行为型设计模式,它使得算法可以独立于使用它的客户端而变化。具体来说,策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法...

    Java设计模式 设计模式介绍

    2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、设计模式之Strategy(策略) 10、设计模式之...

    深入浅出设计模式-策略模式 ipad、iphone开发实现

    《深入浅出设计模式》是设计模式领域的一本经典著作,其第一章就详细介绍了策略模式。策略模式的核心思想是定义一系列算法,并将每一个算法封装起来,使它们可以相互替换。这样,算法的变化就不会影响到使用算法的...

    php设计模式介绍

    《PHP设计模式介绍》第七章 策略模式 《PHP设计模式介绍》第八章 迭代器模式 《PHP设计模式介绍》第九章 观测模式 《PHP设计模式介绍》第十章 规范模式 《PHP设计模式介绍》第十一章 章代理模式 《PHP设计模式...

    [行为模式] head first 设计模式之策略模式(strategy)

    Head First 设计模式这本书以其独特的教学方式深入浅出地介绍了设计模式,策略模式也不例外。书中通过生动的例子和幽默的插图,帮助读者理解策略模式的概念和应用。例如,书中可能会用到一个简单的游戏策略类,比如...

    23种设计模式之:建造者,代理,观察,策略,状态模式

    本文将重点介绍标题中提到的五种设计模式:建造者模式、代理模式、观察者模式、策略模式以及状态模式。 **1. 建造者模式(Builder)** 建造者模式是一种创建型设计模式,它允许我们分步骤构建复杂对象,而无需暴露...

    深入浅出设计模式培训课件_2

    #### 六、策略模式介绍 策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。 1. **应用场景**:当一个系统需要根据不同的条件选择不同的行为时,...

    12复习1

    【策略模式介绍】 策略模式是一种行为型设计模式,它允许在运行时选择不同的算法或策略。策略模式包括三个主要角色:环境类、抽象策略类和具体策略类。环境类负责执行策略,持有对抽象策略类的引用;抽象策略类定义...

    c#代码介绍23种设计模式-20策略者模式(附代码)

    在现实生活中,策略模式的例子也非常常见,例如,中国的所得税,分为企业所得税、外商投资企业或外商企业所得税和个人所得税, 针对于这3种所得税,针对每种,所计算的方式不同,个人所得税有个人所得税的计算方式,...

Global site tag (gtag.js) - Google Analytics