【设计模式-6】策略模式

策略模式

策略模式是对算法的封装,把一系列算法封装到对应的类中。并且这些类实现相同的接口,相互之间可以替换。

它把算法的责任和算法本身分割开,委派给不同的对象管理。

优点

策略模式的优点

  • 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
  • 策略模式提供了管理相关的算法族的办法。
  • 策略模式提供了可以替换继承关系的办法。
  • 使用策略模式可以避免使用多重条件转移语句。

缺点

策略模式的缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

适用环境

在以下情况下可以使用策略模式:

  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  • 一个系统需要动态地在几种算法中选择一种。
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
  • 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值