索引
- 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 }
相关推荐
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,有时我们需要根据不同的场景或条件选择不同的算法或行为。策略模式允许我们将这些算法封装成独立的类,每个类代表一种策略,然后在运行...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择合适的...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式通常通过定义一系列算法类并让它们之间可以互换来实现。这些算法类都实现了一个公共接口,使得它们可以被相同的客户端代码调用,而...
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式允许你使用算法族,而无需在代码中硬编码这些算法。通过将算法封装到具有共同接口的独立对象中,策略模式使得你可以根据需要灵活地切换算法,...
策略模式(Strategy Pattern)是23种设计模式之一,属于行为型模式。该模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化独立于使用算法的客户。 在C#中实现策略模式...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式主要用于封装一系列算法,并让它们之间可以互相替换,使得算法的变化独立于使用算法的客户。这种模式通常涉及三个主要角色:策略...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式允许我们将这些算法封装成独立的类,使得它们可以互换,从而提高...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C#中,策略模式经常被用来解决复杂的问题,特别是在需要动态切换算法或行为的场景下。它通过将算法封装到具有独立接口的类中,使得算法可以互相替换...
### Java的24种设计模式介绍与6大设计原则 #### 第一部分:设计模式概览 设计模式是在软件设计过程中经过验证的解决方案,用于解决在特定情境下出现的设计问题。这些模式提供了一种通用的方式,使得开发人员能够...
在HeadFirst的《设计模式》一书中,作者以通俗易懂的方式介绍了各种设计模式,包括策略模式,适合初学者和有经验的开发者深入理解设计模式的原理和应用。通过阅读这本书,我们可以更好地掌握如何在实际项目中灵活...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种灵活的方式来处理这种情况,通过将每种算法封装为一个...
在《设计模式-策略者》这篇文章中,作者深入浅出地介绍了策略模式的基本概念、结构和实现方式。文章可能涵盖了以下几个关键知识点: 1. **模式定义**:策略模式允许在运行时选择不同的算法或策略,提供了一种用面向...
在软件开发过程中,设计模式是一种重要的工具,它为解决常见的设计问题提供了可复用的解决方案。本课件主要讲解了Gang-of-Four(GOF)设计模式,这是面向对象设计中广泛采用的一套经典模式。GOF设计模式由四人组合...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来改变算法的情况。策略模式就是为了解决这类问题而诞生的,它允许我们在不修改对象本身的情况下...
这份文档讲诉了设计模式之策略(Strategy)模式,希望可以帮助学习的人!
首先,标题“Garter:rethink-security-risk-strategy”提示我们,文章将讨论重新思考安全风险策略的重要性,这是针对组织和企业管理者在现代网络安全环境中的一个关键议题。Gartner建议企业领导者应该拥抱现代网络...
### 设计模式培训-strategy #### 一、设计模式概览 设计模式是软件工程领域的一个重要概念,它提供了一套解决常见问题的有效方法。在软件开发的过程中,开发者经常会遇到相似的问题,这些问题往往有着类似的解决...
### 设计模式精解——GoF 23种设计模式解析及C++实现 #### 0. 引言 设计模式作为面向对象编程的核心组成部分,是软件开发者在长期实践中总结出来的最佳实践。通过深入理解这些设计模式,我们可以更好地进行面向...