策略模式
Posted aohost
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。
策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,并且这些算法可以相互替换,该模式使得算法可独立使用于它客户的而变化。
该模式有一个算法实现的抽象Strategy,它将不同的算法抽象了出来。具体的实现则在ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC中。然后有一个策略的上下文Context,它含有对Strategy的引用。通过ContextInterface()对具体算法进行调用。
我们先实现抽象算法类Strategy
//抽象算法类 abstract class Strategy { //算法方法 public abstract void AlgorithmInterface(); }
然后实现它的具体算法
//具体算法A class ConcreteStrategyA : Strategy { //算法A实现方法 public override void AlgorithmInterface() { Console.WriteLine("算法A实现"); } } //具体算法B class ConcreteStrategyB : Strategy { //算法B实现方法 public override void AlgorithmInterface() { Console.WriteLine("算法B实现"); } } //具体算法C class ConcreteStrategyC : Strategy { //算法C实现方法 public override void AlgorithmInterface() { Console.WriteLine("算法C实现"); } }
添加我们的上下文
//上下文 class Context { Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } //上下文接口 public void ContextInterface() { strategy.AlgorithmInterface(); } }
这样我们一个基本的策略模式就设计好了,我们只需要在不同场景下进行不同的调用就行了
static void Main(string[] args) { Context context; context = new Context(new ConcreteStrategyA()); context.ContextInterface(); context = new Context(new ConcreteStrategyB()); context.ContextInterface(); context = new Context(new ConcreteStrategyC()); context.ContextInterface(); Console.Read(); }
这样就实现了对不同算法实现的调用。策略模式还可以结合工厂模式使用,是代码更加灵活。重点就是修改我们的Context,让它支持工厂模式。
class Context { Strategy strategy; public Context(string type) { switch (type) { case "AlgorithmA": strategy = new ConcreteStrategyA(); return; case "AlgorithmB": strategy = new ConcreteStrategyB(); return; case "AlgorithmC": strategy = new ConcreteStrategyC(); return; default: throw new Exception("Invalid Type"); } } //上下文接口 public void ContextInterface() { strategy.AlgorithmInterface(); } }
我们在使用的时候就可以通过简单工厂模式的方式去使用它
static void Main(string[] args) { Context context; context = new Context("AlgorithmA"); context.ContextInterface(); context = new Context("AlgorithmB"); context.ContextInterface(); context = new Context("AlgorithmC"); context.ContextInterface(); Console.Read(); }
策略模式是一种比较常见的设计模式,例如商场结账一个场景。都是结账,可能有的会打折,有的会原价,有的会满多少返多少,这就是不同的算法实现。
以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章