定义一系列算法,把它们分别封装起来,使得它们可相互替换。最终各个算法可以独立变化。
主要组成:
Strategy-策略父类或接口
ConcreteStrategy-具体策略,实现不同算法
Context-上下文,客户通过该类对不同策略进行调用
状态与策略的区别:
状态:对象内部状态的变化,从而表现为不同的行为,关键在于对象内部。
策略:对象使用不同的策略达到类似的目的,关键在于对象外部算法。
举个栗子:
- 状态相当于人的婴儿、少年、青年、中年、老年时期。
- 策略相当于人使用的工具,比如出行方式:飞机、火车、自行车等等。
相关类:
using System;
namespace Strategy
{
/// <summary>
/// 旅游(策略父类或接口)
/// </summary>
abstract class TravelStrategy
{
public abstract void Travel();
}
/// <summary>
/// 飞机(具体策略)
/// </summary>
class Plane : TravelStrategy
{
public override void Travel()
{
Console.WriteLine("坐飞机旅游");
}
}
/// <summary>
/// 火车
/// </summary>
class Train : TravelStrategy
{
public override void Travel()
{
Console.WriteLine("坐火车旅游");
}
}
/// <summary>
/// 单车
/// </summary>
class Bike : TravelStrategy
{
public override void Travel()
{
Console.WriteLine("骑单车旅游");
}
}
/// <summary>
/// 旅游上下文
/// </summary>
class TravelContext
{
TravelStrategy travelStrategy;
public TravelContext(TravelStrategy travelStrategy)
{
this.travelStrategy = travelStrategy;
}
public void Travel()
{
travelStrategy.Travel();
}
}
}
调用:
using System;
namespace Strategy
{
class Program
{
static void Main(string[] args)
{
//坐飞机旅游
TravelContext travelByPlane = new TravelContext(new Plane());
travelByPlane.Travel();
//坐火车旅游
TravelContext travelByTain= new TravelContext(new Train());
travelByTain.Travel();
//骑单车旅游
TravelContext travelByBike = new TravelContext(new Bike());
travelByBike.Travel();
Console.Read();
}
}
}
结果:
参考资料:《设计模式-可复用面对对象软件的基础》