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

设计模式之美:Strategy(策略) -未经作者同意的转载

 
阅读更多
 

索引

别名

  • Policy

意图

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。使得算法可独立于使用它的客户而变化。

Define a family of algorithms, encapsulate each one, and make them interchangeable.

Strategy lets the algorithm vary independently from clients that use it.

结构

参与者

Strategy

  • 定义所有支持的算法的公共接口。Context 使用这个接口来调用 ConcreteStrategy 定义的算法。

ConcreteStrategy

  • 实现 Strategy 接口和具体算法。

Context

  • 用一个 ConcreteStrategy 对象来配置。
  • 维护一个对 Strategy 对象的引用。
  • 可定义一个接口来让 Strategy 访问它的数据。

适用性

在以下情况下可以使用 Strategy 模式:

  • 许多相关的类仅仅是行为有异。Strategy 提供了一种用多个行为中的一个行为来配置一个类的方法。
  • 需要使用一个算法的不同变体。
  • 算法使用客户不应该知道的数据。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关条件分支移入它们各自的 Strategy 类中以代替。

缺点

  • 客户必须了解不同的 Strategy。要选择合适的 Strategy 就必须知道这些 Strategy 有何不同。
  • Strategy 和 Context 之间的通信开销。Context 可能创建一些 ConcreteStrategy 不使用的参数。
  • 增加了对象的数目。

效果

  • 相关算法系列。
  • 一个替代继承的方法。
  • 消除了一些条件语句。
  • 实现的选择。相同行为的不同实现。

相关模式

  • 使用 Flyweight 模式实现 Strategy。

实现

实现方式(一):使用不同的 Strategy 处理内部状态。

Strategy 和 Context 接口必须使得 ConcreteStrategy 能够有效的访问它所需要的 Context 中的任何数据。

一种办法是让 Context 将数据放在参数中传递给 Strategy 操作。这使得 Strategy 和 Context 解耦。

但另一方面,Context 可能发送一些 Strategy 不需要的数据。

另一种办法是让 Context 将自身作为一个参数传递给 Strategy,该 Strategy 再显式地向该 Context 请求数据。

或者 Strategy 可以直接保存对 Context 的引用。

这种情况下,Strategy 可以请求到它需要的数据。但这使得 Strategy 和 Context 更紧密的耦合在一起。

复制代码
 1 namespace StrategyPattern.Implementation1
 2 {
 3   public abstract class Strategy
 4   {
 5     public abstract void AlgorithmInterface(string state);
 6   }
 7 
 8   public class ConcreteStrategyA : Strategy
 9   {
10     public override void AlgorithmInterface(string state)
11     {
12       Console.WriteLine("Use Concrete Strategy A to handle " + state);
13     }
14   }
15 
16   public class ConcreteStrategyB : Strategy
17   {
18     public override void AlgorithmInterface(string state)
19     {
20       Console.WriteLine("Use Concrete Strategy B to handle " + state);
21     }
22   }
23 
24   public class Context
25   {
26     private Strategy _strategy;
27 
28     public void SetStrategy(Strategy strategy)
29     {
30       _strategy = strategy;
31     }
32 
33     public string State { get; set; }
34 
35     public void ContextInterface()
36     {
37       _strategy.AlgorithmInterface(State);
38     }
39   }
40 
41   public class Client
42   {
43     public void TestCase1()
44     {
45       var context = new Context();
46       context.State = "Hello World";
47 
48       context.SetStrategy(new ConcreteStrategyA());
49       context.ContextInterface();
50 
51       context.SetStrategy(new ConcreteStrategyB());
52       context.ContextInterface();
53     }
54   }
55 }
复制代码

 

分享到:
评论

相关推荐

    走进设计模式之 策略模式(Strategy)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,有时我们需要根据不同的场景或条件选择不同的算法或行为。策略模式允许我们将这些算法封装成独立的类,每个类代表一种策略,然后在运行...

    设计模式专题之(十六)策略模式---设计模式策略模式示例代码(python--c++)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择合适的...

    设计模式C++学习之策略模式(Strategy)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式通常通过定义一系列算法类并让它们之间可以互换来实现。这些算法类都实现了一个公共接口,使得它们可以被相同的客户端代码调用,而...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    设计模式-策略模式(Strategy)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式允许你使用算法族,而无需在代码中硬编码这些算法。通过将算法封装到具有共同接口的独立对象中,策略模式使得你可以根据需要灵活地切换算法,...

    设计模式-策略模式 Strategy Pattern 详解

    策略模式(Strategy Pattern)是23种设计模式之一,属于行为型模式。该模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化独立于使用算法的客户。 在C#中实现策略模式...

    设计模式-策略模式-c++版

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式主要用于封装一系列算法,并让它们之间可以互相替换,使得算法的变化独立于使用算法的客户。这种模式通常涉及三个主要角色:策略...

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

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式允许我们将这些算法封装成独立的类,使得它们可以互换,从而提高...

    C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C#中,策略模式经常被用来解决复杂的问题,特别是在需要动态切换算法或行为的场景下。它通过将算法封装到具有独立接口的类中,使得算法可以互相替换...

    java的24种设计模式介绍与6大设计原则

    ### Java的24种设计模式介绍与6大设计原则 #### 第一部分:设计模式概览 设计模式是在软件设计过程中经过验证的解决方案,用于解决在特定情境下出现的设计问题。这些模式提供了一种通用的方式,使得开发人员能够...

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

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

    设计模式之策略模式(Strategy Pattern)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种灵活的方式来处理这种情况,通过将每种算法封装为一个...

    设计模式-策略者

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

    软件需求分析课件:Chap 10-GOF pattern.ppt

    在软件开发过程中,设计模式是一种重要的工具,它为解决常见的设计问题提供了可复用的解决方案。本课件主要讲解了Gang-of-Four(GOF)设计模式,这是面向对象设计中广泛采用的一套经典模式。GOF设计模式由四人组合...

    设计模式系列博客--策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来改变算法的情况。策略模式就是为了解决这类问题而诞生的,它允许我们在不修改对象本身的情况下...

    设计模式之策略(Strategy)模式

    这份文档讲诉了设计模式之策略(Strategy)模式,希望可以帮助学习的人!

    Garter:rethink-security-risk-strategy

    首先,标题“Garter:rethink-security-risk-strategy”提示我们,文章将讨论重新思考安全风险策略的重要性,这是针对组织和企业管理者在现代网络安全环境中的一个关键议题。Gartner建议企业领导者应该拥抱现代网络...

    设计模式培训-strategy

    ### 设计模式培训-strategy #### 一、设计模式概览 设计模式是软件工程领域的一个重要概念,它提供了一套解决常见问题的有效方法。在软件开发的过程中,开发者经常会遇到相似的问题,这些问题往往有着类似的解决...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现 #### 0. 引言 设计模式作为面向对象编程的核心组成部分,是软件开发者在长期实践中总结出来的最佳实践。通过深入理解这些设计模式,我们可以更好地进行面向...

Global site tag (gtag.js) - Google Analytics