策略模式

来源:互联网 发布:矩阵行列式的性质 编辑:程序博客网 时间:2024/04/29 08:26

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。

策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

策略模式中有三个对象:

(1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。

(2)抽象策略对象:它可由接口或抽象类来实现。

(3)具体策略对象:它封装了实现同接口不功能的不同算法。

利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

 

缺点:在客户端代码中,需要知道有多少策略类,这样才能开始客户端的代码。另外,策略类超过5个就会比较难维护


我们再次以求职为例,主要如下:

1、首先定义一个抽象策略对象

//定义工作类接口,有一个求职方法public interface IJobs {void Profession();}

2、然后,我们来具体策略对象

//具体策略产品Apublic class Salesman : IJobs {public void Profession(){Debug.Log("我要找销售的工作");}}

//具体策略产品Bpublic class Programmer : IJobs {public void Profession(){Debug.Log("我要找程序员工作");}}

//具体策略产品Cpublic class Personnel : IJobs {public void Profession(){Debug.Log("我要找人事的工作");}}


3、然后我们定义策略模式环境对象,该类中实现了对抽象策略对象中定义的接口或者抽象类的引用,然后再通过析构函数实例化抽象策略对象。

//定义策略模式的人才市场类(环境对象)public class STalentMarket  {private IJobs _iJobs;public STalentMarket(IJobs _job){_iJobs = _job;}public void Profession(){_iJobs.Profession();}}

4、测试客户端,通过直接实例化具体策略对象,来调用环境对象类中的方法

public class JobChoiceer : MonoBehaviour {//策略模式客户端private STalentMarket _sTalentMarket;void Start () {//选择程序员工作_sTalentMarket = new STalentMarket(new Programmer());_sTalentMarket.Profession();//选择人事工作_sTalentMarket = new STalentMarket(new Personnel());_sTalentMarket.Profession();//选择销售员工作_sTalentMarket = new STalentMarket(new Salesman());_sTalentMarket.Profession();}}

 

5、策略者模式的适用场景

在下面的情况下可以考虑使用策略模式:

一个系统需要动态地在几种算法中选择一种的情况下。那么这些算法可以包装到一个个具体的算法类里面,并为这些具体的算法类提供一个统一的接口。

如果一个对象有很多的行为,如果不使用合适的模式,这些行为就只好使用多重的if-else语句来实现,此时,可以使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象涉及的概念。

 

6、策略者模式的优缺点

策略模式的主要优点有:

策略类之间可以自由切换。由于策略类都实现同一个接口,所以使它们之间可以自由切换。

易于扩展。增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码。

避免使用多重条件选择语句,充分体现面向对象设计思想。

策略模式的主要缺点有:

客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这点可以考虑使用IOC容器和依赖注入的方式来解决,关于IOC容器和依赖注入(Dependency Inject)的文章可以参考:IoC 容器和Dependency Injection 模式。

策略模式会造成很多的策略类。



0 0
原创粉丝点击