窝牛号

策略模式-策略模式的优缺点

今天窝牛号就给我们广大朋友来聊聊策略模式,以下关于的观点希望能帮助到您找到想要的学习。

本文目录包含多个相关词条,可直接点击跳转详细解答!1、策略模式的优缺点2、设计模式——策略模式3、策略模式的概念4、策略模式(对比工厂模式)策略模式的优缺点

优质回答优点:

1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。

2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。

3、 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

缺点:

1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

设计模式——策略模式

优质回答策略模式(Strategy Pattern)是一种比较简单的模式,也叫政策模式(Policy Pattern)其定义如下:Define a family of algorithms each one , and make them interchangeable(定义一组算法,将每个算法都封装起来,并且使他们之间可以互换)

这个定义很清晰、明确,”定义一组算法“就是定义了3个计谋,”将每个算法封装起来“,封装类Context的作用,”使他们可以互换“,因为都实现的是相同的接口。

▶算法可以自由切换

这是策略模式本身定义,只要实现抽象类,他就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供”可自由切换的模式“的策略。

▶避免使用多重条件判断

可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,,同时避免了条件语句判断。

▶扩展性良好

在现有系统中增加一个策略十分容易,只要实现接口就可以,其他都不用修改,类似于一个可反复拆卸的插件,也符合OCP原则(开闭原则)

▶策略类数量多

每一个策略都是一个类,复用可能性很小,类的数量增多。

▶所有策略都需要对外暴露

上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,这与迪米特法则是相违背的。我们可以使用其他的模式来修正这个缺点,如工厂模式、代理模式、享元模式。

▶多个类只有在算法或行为上稍有不同的场景

▶算符需要自由切换的场景

▶需要屏蔽算法规则的场景

如果系统中的一个策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略膨胀和对外暴露的问题。

输入3个参数,进行加减法运算,参数中两个是int型,剩下的一个参数是String类型的,只有”+“、”-“两个符合可以选择,不要考虑什么复杂校验,进行白箱测试,输入的就是标准的int 类型和String类型。

为什么叫策略枚举?首先它是一个枚举类。策略呢我们定义了一个抽象的方法 exec(int a ,int b) 然后在每个枚举成员中进行实现,如果不实现就不能编译。把原有定义在抽象策略中的方法移植到枚举中,每个枚举成员就成为一个具体策略

枚举策略定义如下:

策略模式的概念

优质回答(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

Context(应用场景):

1、需要使用ConcreteStrategy提供的算法。

2、 内部维护一个Strategy的实例。

3、 负责动态设置运行时Strategy具体的实现算法。

4、负责跟Strategy之间的交互和数据传递。

Strategy(抽象策略类):

1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。

ConcreteStrategy(具体策略类):

2、 实现了Strategy定义的接口,提供具体的算法实现。

策略模式(对比工厂模式)

优质回答从策略一词来看, 策略模式是种倾向于行为的模式 .有点类似打仗时的做战方案,一般司令员在做战前都会根据实际情况做出几套不同的方案,如果当时情况有变,就会根据相应的条件来判定用哪一套方案来替换原定方案。但无论如何替换,替换多少次,仗还是要打的。

策略模式的UML图

策略(Strategy)模式在结构上与工厂模式类似,唯一的区别是工厂模式实例化一个产品的操作是在服务端来做的 ,换句话说客户端传达给服务端的只是某种标识,服务端根据该标识实例化一个对象。而策略模式的客户端传达给服务端的是一个实例,服务端只是将该实例拿过去在服务端的环境里执行该实例的方法。

工厂模式和策略模式的区别在于实例化一个对象的位置不同,对工厂模式而言,实例化对象是放在服务端的,即放在了工厂类里面;

而策略模式实例化对象的操作在客户端,服务端的“销售部门”只负责传递该对象,并在服务端的环境里执行特定的操作。

工厂模式要求服务端的销售部门足够灵敏,而策略模式由于对策略进行了封装,所以他的销售部门比较傻,需要客户提供足够能区分使用哪种策略的参数,而这最好的就是该策略的实例了。

策略模式的优缺点

策略模式的主要优点有:

策略模式的缺点主要有两个:

适用场景

至少在在以下两种情况下,大家可以考虑使用策略模式,

几个类的主要逻辑相同,只在部分逻辑的算法和行为上稍有区别的情况。

有几种相似的行为,或者说算法,客户端需要动态地决定使用哪一种,那么可以使用策略模式,将这些算法封装起来供客户端调用。

策略模式是一种简单常用的模式,我们在进行开发的时候,会经常有意无意地使用它,一般来说,策略模式不会单独使用,跟模版方法模式、工厂模式等混合使用的情况比较多。

今天的内容先分享到这里了,读完本文《策略模式-策略模式的优缺点》之后,是否是您想找的答案呢?想要了解更多,敬请关注baike.ccv168.com,您的关注是给小编最大的鼓励。

本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除

窝牛号 wwww.93ysy.com   沪ICP备2021036305号-1