策略模式(Strategy),又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式中有三个对象:
(1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)抽象策略对象:它可由接口或抽象类来实现。
(3)具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
故事一:话说天下大势,分久必合,合久必分
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列,还想着娶纯情少女的,色咪咪的刘备老爷子去江东,多亏小亮同志的妙计
还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜
锦囊妙计:
计谋一:找乔国老帮忙,使孙权不能杀刘备
计谋二:金钱贿赂,求吴国太开个绿灯,放行
计谋三:孙夫人断后,挡住追兵
故事二:
贩卖各类书籍的电子商务网站的购物车系统。可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。根据描述,折扣是根据以下的几个算法中的一个进行的:
折扣优惠算法:
算法一:对初级会员没有折扣。
算法二:对中级会员提供10%的促销折扣。
算法三:对高级会员提供20%的促销折扣。
故事三:
过年回家:我们可以有几个策略可以考虑:可以自己驾车,去汽车站乘汽车,坐火车,坐飞机。最终的目标都相同:回到家中
每个策略都可以得到相同的结果:回家,但是它们使用了不同的资源。选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。
回家交通工具选择:
选择一:自己驾车
选择二:去汽车站乘汽车
选择三:坐火车
选择四:坐飞机
策略模式仅仅封装算法,提供新的算法插入到已有系统中,以及老算法从系统中“退休”的方法,策略模式并不决定在何时使用何种算法。在什么情况下使用什么算法是由客户端决定的。
策略模式的重心
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
算法的平等性
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。
运行时策略的唯一性
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。
/**
回家交通工具选择
*/
public interface GoHomeMethod{
public void goHome();
}
/**
1:乘坐飞机
*/
public class GoHomeByAirPlanelStrategy implements GoHomeMethod {
public void goHome(){
echo("goHome by AirPlain");
}
}
/**
2:乘坐火车
*/
public class GoHomeByTrainStrategy implements GoHomeMethod {
public void goHome(){
echo("goHome by Train");
}
}
**
* 环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
* 算法解决类,以提供客户选择使用何种解决方案:
*/
class PersonContext{
private GoHomeMethod goHomeMethod= null;
public PersonContext(goHomeMethod goHomeMethod){
this.goHomeMethod = goHomeMethod;
}
/**
* 回家选择方式(和构造方法等价)
*/
public function setGoHomeMethod(goHomeMethod goHomeMethod){
this.goHomeMethod = goHomeMethod;
}
/**
* 回家
*/
public void goHome(){
return this.goHomeMethod.goHome();
}
}
public class Test{
public static void main(String args[]){
//乘坐飞机
PersonContext personContext = new PersonContext(new GoHomeByAirPlanelStrategy());
personContext.goHome();
//改骑乘坐火车
personContext.setGoHomeMethod(new GoHomeByTrainStrategy());
personContext.goHome();
}
}
相关推荐
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择具体...
策略模式StrategyPattern,通过实现鸭子的飞行策略以及叫声策略演示策略模式的具体实现!
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,我们经常遇到需要在...在压缩包文件`strategyPattern`中,可能包含了示例代码或者进一步的解释材料,帮助读者更好地理解和应用策略模式。
在"StrategyPattern"这个压缩包中,我们可以预期包含了一些示例代码,这些代码可能展示了如何在实际项目中应用策略模式。通常,一个策略模式的实现包括以下几个关键部分: 1. **策略接口(Context)**:这是所有...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件工程中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并让它们之间可以互相...
Java策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常通过定义一系列算法,并将每个算法封装为一个类,然后让它们之间可以互换来实现。这样做的好处是,我们可以让算法独立于...
《商场促销:深入理解策略模式》 在软件设计中,策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在这个例子中,我们关注的是商场促销活动,这是一个经常需要根据具体情况调整策略的场景。策略模式...
1. 策略模式(STRATEGYPATTERN):策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们可以互换。策略模式让算法的变化独立于使用算法的客户。 2. 代理模式(PROXYPATTERN):代理模式为其他对象提供一...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并让它们之间可以互相...
以和平精英的特种作战模式为例,无论是工程兵还是医疗兵,都有射击这个行为,此外这些兵种都有一项特殊技能,但不知道具体行为,比如建盾牌、治疗等,可以选择在特殊技能上应用策略模式,之后如需修改具体技能只需...
通过以上代码,我们可以看到策略模式的核心在于定义了一个策略接口和多个实现该接口的具体策略类,然后通过上下文环境类来调用具体的策略方法。这种方式使得我们可以轻松地添加新的策略而无需修改原有的代码,从而...
设计模式分为三大类:创建型模式(如单例模式、工厂方法模式、抽象工厂模式)、结构型模式(如代理模式、装饰器模式、适配器模式)和行为型模式(如观察者模式、策略模式、职责链模式)。 在Objective-C中,我们...
策略模式(StrategyPattern)是设计模式中的一种行为模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响到使用算法的客户端。策略模式让算法独立于使用它的客户端而变化,...
1. **策略模式(StrategyPattern)**:定义一系列算法,将每个算法封装起来,并使它们可相互替换。策略模式让算法的变化独立于使用算法的客户。 2. **代理模式(ProxyPattern)**:提供一个代理对象来代表另一个...
- 策略模式(StrategyPattern):允许在一个类中定义多种行为,并将这些行为以策略的形式来操作,类似于提到的锦囊妙计,赵云可以根据不同的情况选择不同的策略来执行。 - 代理模式(ProxyPattern):为其他对象...
`StrategyPattern.java`可能包含了一个策略接口和多个实现了不同策略的类。 10. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。`ProxyDemo.java`可能展示了如何创建代理对象以控制原对象的...
1. 策略模式【StrategyPattern】:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响到使用算法的客户端。在策略模式中,策略通常由接口定义,并由不同的具体策略类实现。客户端...