策略模式
策略模式是对算法的封装,把一系列算法封装到对应的类中。并且这些类实现相同的接口,相互之间可以替换。
它把算法的责任和算法本身分割开,委派给不同的对象管理。
优点
策略模式的优点
- 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
- 策略模式提供了管理相关的算法族的办法。
- 策略模式提供了可以替换继承关系的办法。
- 使用策略模式可以避免使用多重条件转移语句。
缺点
策略模式的缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
适用环境
在以下情况下可以使用策略模式:
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
- 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。
Strategy(抽象策略类) | 通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。 |
ConcreteStrategy(具体策略类) | 具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。 |
Context(环境类) | 对策略进行二次封装,目的是避免高层模块对策略的直接调用 |
//Strategy(抽象策略类)打折策略类
public interface DisCount
{
void GetDisCount();
}
//ConcreteStrategy(具体策略类) 双11打折策略类
public class DisCount_11:DisCount
{
public void GetDisCount()
{
Debug.Log("获取双11打折算法");
}
}
//ConcreteStrategy(具体策略类) 双12打折打折策略类
public class DisCount_12:DisCount
{
public void GetDisCount()
{
Debug.Log("获取双12打折算法");
}
}
//Context(环境类)
class Context
{
private DisCount m_disCount;
public Context(DisCount _discount){
this.m_disCount = _discount;
}
public void execute(){
m_disCount.GetDisCount();
}
}
public class Client: MonoBehaviour {
// Use this for initialization
void Start () {
Context tempContext;
tempContext = new Context(new DisCount_11());
tempContext.execute();
tempContext = new Context(new DisCount_12());
tempContext.execute();
}
}
参考:
https://blog.csdn.net/zhengzhb/article/details/7609670
https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html
http://www.runoob.com/design-pattern/strategy-pattern.html
http://www.unity.5helpyou.com/category/unity-designmodels/page/2