首页 > 代码库 > 设计模式------策略模式
设计模式------策略模式
策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户。何谓算法呢?它是一种描述程序行为的语言,广泛应用于计算机科学领域,是一种让程序最为简洁的思考方式。
一、组成:
1.抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
2.具体策略角色:包装了相关的算法和行为。
3.环境角色:持有一个策略类的引用,最终给客户端调用。
二、应用场景:
1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
三、优缺点:优点:
1、提供了管理相关的算法族的办法。
2、提供了可以替换继承关系的办法。
3、可以避免使用多重条件转移语句。
缺点:
1、策略模式只适用于客户端知道所有的算法或行为的情况。
2、策略模式造成很多的策略类,每个具体策略类都会产生一个新类,可以使用享元模式来减少对象的数量。
四、策略模式vs简单工厂模式:
简单工厂模式是创建型模式,关注对象的创建。策略模式是行为型模式,关注行为的封装。简单工厂模式是根据不同的条件返回一个适合的类给你使用,然后调用者使用工厂类返回的类去完成相应的操作。而策略模式是首先创建一个想使用的类实例,然后实例被当作参数传递进去,既而通过该实例去调用不用的算法。在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。
五、代码示范:
1.抽象策略类:
//抽象算法类
abstract class Strategy
{
//算法方法
public abstract void AlgorithmInterface();
}
2.具体策略角色: //具体算法A
class ConcreteStrategyA : Strategy
{
//算法A实现方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法A实现");
}
}
//具体算法B
class ConcreteStrategyB : Strategy
{
//算法B实现方法
...
}
//具体算法C
class ConcreteStrategyC : Strategy
{
//算法C实现方法
...
}
3.环境角色: //上下文
class Context
{
Strategy strategy;
public Context(Strategy strategy)
{
this.strategy = strategy;
}
//上下文接口
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}
4.客户端: 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();
}
5.运行结果:策略模式是一种定义一系列算法的方法,这些算法完成的都是相同的工作。比如说超市搞活动,具有多种收银方式,可以打折,满200返50,满100积1分等等,它们只是实现不同。策略模式封装了算法,它们以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。这样收银员不必搞清楚具体的收费方式是如何计算的,只需机械的简单操作,从而减少了误差,提高了效率。策略模式还可以简化单元测试,优化系统结构。但如果超市要增加新的算法,就需要更改底层的代码,如何避免呢?这就要用到我们以后要学的反射技术了,期待ing,办法总是比困难多的。