策略模式java实现,JAVA设计模式详解

  策略模式java实现,JAVA设计模式详解

  00-1010策略模式意图问题解决方案真实世界类比策略模式结构伪代码策略模式适合应用场景实现模式策略模式的优缺点策略模式与其他模式的优缺点关系

  00-1010也称为:策略

  00-1010策略模式是一种行为设计模式,它允许你定义一系列算法,并将每个算法放入一个独立的类中,这样算法的对象就可以互相替换。

  00-1010有一天,你要为游客创建一个导游程序。该程序的核心功能是提供精美的地图,帮助用户在任何城市快速定位。

  用户期待的程序新功能是自动路线规划:输入地址后想在地图上看到到达目的地的最快路线。

  第一版程序只能规划高速公路路线。开车的人对此很满意。但显然,并不是所有人都会开车度假。所以你在下次更新中加入了规划行走路线的功能。从此,你增加了规划公共交通路线的功能。

  而这仅仅是开始。很快,你又要为骑车人规划路线了。过了一段时间,你就要规划游览市内所有景点的路线了。

  引导代码会变得非常臃肿。

  虽然这个应用从商业角度来看非常成功,但是它的技术部分却让你很头疼:每增加一个新的路线规划算法,导游应用中的主要类的体量都会翻倍。最后,在某个时候,你觉得自己无法继续维护这堆代码了。

  无论是修复简单的缺陷还是微调街道权重,对算法的任何修改都会影响整个类,从而增加了将错误引入现有正常运行代码的风险。

  另外,团队合作会变得效率低下。如果你在应用程序成功发布后招募团队成员,他们会抱怨在合并冲突上花了太多时间。在实现新功能的过程中,你的团队需要修改同一个庞大的类,这样他们写的代码可能会互相冲突。

  00-1010策略模式建议找出负责以许多不同方式完成特定任务的类,然后从中提取算法到一组称为策略的独立类中。

  名为context的原始类必须包含一个成员变量来存储对每个策略的引用。上下文将工作委托给连接的策略对象,而不是执行任务。

  上下文不负责选择满足任务需求的算法。——客户端会将所需的策略传递给上下文。其实语境也不是很懂策略。它将通过同一个通用接口与所有策略进行交互,该接口只需要暴露一个方法来触发所选策略中封装的算法。

  因此,上下文可以独立于特定的策略。这样,您可以添加新算法或修改现有算法,而无需更改上下文代码或其他策略。

  路线规划策略。

  在导游应用中,每种路线规划算法都可以提取到一个独立的类中,只需要一种建立路线的方法。该方法接收起点和终点作为参数,并返回路线中的一组中间点。

  即使传递给每个路径规划类的参数相同,它创建的路线也可能完全不同。主导游类的主要工作是在地图上渲染一系列中途点,并不关心算法如何选择。这个类中还有一个切换当前路径规划策略的方法,所以客户端(比如用户界面中的按钮)可以用其他策略替换当前选择的路径规划行为。

  

目录

 

  去机场的各种旅行策略

  如果你需要去机场。你可以选择坐公交车,预定出租车或者骑自行车。这些是你的旅行策略。你可以根据预算或时间等因素选择其中一种策略。

  

策略模式

 

  上下文维护对特定策略的引用,并且只通过策略接口与对象通信。策略接口是所有特定策略的公共接口,它声明了一种方法,在该方法中使用上下文来执行策略。具体策略(具体策略)实现了上下文中使用的算法的各种变体。当上下文需要运行算法时,它将调用其连接的策略对象上的执行方法。上下文并不清楚所涉及的策略类型以及算法是如何执行的。客户端创建一个特定的策略对象,并将其传递给上下文。上下文为客户端提供了一个设置器,用于在运行时替换相关联的策略。

  00-1010在此示例中,上下文使用多个策略来执行不同的计算操作。

  //策略接口声明不同版本的算法之间的通用操作。上下文将使用此接口来//调用具有特定策略定义的算法。连接

   Strategy is method execute(a, b)// 具体策略会在遵循策略基础接口的情况下实现算法。该接口实现了它们在上下文// 中的互换性。class ConcreteStrategyAdd implements Strategy is method execute(a, b) is return a + bclass ConcreteStrategySubtract implements Strategy is method execute(a, b) is return a - bclass ConcreteStrategyMultiply implements Strategy is method execute(a, b) is return a * b// 上下文定义了客户端关注的接口。class Context is // 上下文会维护指向某个策略对象的引用。上下文不知晓策略的具体类。上下 // 文必须通过策略接口来与所有策略进行交互。 private strategy: Strategy // 上下文通常会通过构造函数来接收策略对象,同时还提供设置器以便在运行 // 时切换策略。 method setStrategy(Strategy strategy) is this.strategy = strategy // 上下文会将一些工作委派给策略对象,而不是自行实现不同版本的算法。 method executeStrategy(int a, int b) is return strategy.execute(a, b)// 客户端代码会选择具体策略并将其传递给上下文。客户端必须知晓策略之间的差// 异,才能做出正确的选择。class ExampleApplication is method main() is 创建上下文对象。 读取第一个数。 读取最后一个数。 从用户输入中读取期望进行的行为。 if (action == addition) then context.setStrategy(new ConcreteStrategyAdd()) if (action == subtraction) then context.setStrategy(new ConcreteStrategySubtract()) if (action == multiplication) then context.setStrategy(new ConcreteStrategyMultiply()) result = context.executeStrategy(First number, Second number) 打印结果。

 

  

策略模式适合应用场景

当你想使用对象中各种不同的算法变体,并希望能在运行时切换算法时,可使用策略模式。

 

  策略模式让你能够将对象关联至可以不同方式执行特定子任务的不同子对象,从而以间接方式在运行时更改对象行为。

  当你有许多仅在执行某些行为时略有不同的相似类时,可使用策略模式。

  策略模式让你能将不同行为抽取到一个独立类层次结构中,并将原始类组合成同一个,从而减少重复代码。

  如果算法在上下文的逻辑中不是特别重要,使用该模式能将类的业务逻辑与其算法实现细节隔离开来。

  策略模式让你能将各种算法的代码、内部数据和依赖关系与其他代码隔离开来。不同客户端可通过一个简单接口执行算法,并能在运行时进行切换。

  当类中使用了复杂条件运算符以在同一算法的不同变体中切换时,可使用该模式。

  策略模式将所有继承自同样接口的算法抽取到独立类中,因此不再需要条件语句。原始对象并不实现所有算法的变体,而是将执行工作委派给其中的一个独立算法对象。

  

 

  

实现方式

从上下文类中找出修改频率较高的算法(也可能是用于在运行时选择某个算法变体的复杂条件运算符)。声明该算法所有变体的通用策略接口。将算法逐一抽取到各自的类中,它们都必须实现策略接口。在上下文类中添加一个成员变量用于保存对于策略对象的引用。然后提供设置器以修改该成员变量。上下文仅可通过策略接口同策略对象进行交互,如有需要还可定义一个接口来让策略访问其数据。客户端必须将上下文类与相应策略进行关联,使上下文可以预期的方式完成其主要工作。

 

  

 

  

策略模式优缺点

你可以在运行时切换对象内的算法。你可以将算法的实现和使用算法的代码隔离开来。你可以使用组合来代替继承。开闭原则。你无需对上下文进行修改就能够引入新的策略。

策略模式优缺点

如果你的算法极少发生改变,那么没有任何理由引入新的类和接口。使用该模式只会让程序过于复杂。客户端必须知晓策略间的不同——它需要选择合适的策略。许多现代编程语言支持函数类型功能,允许你在一组匿名函数中实现不同版本的算法。这样,你使用这些函数的方式就和使用策略对象时完全相同,无需借助额外的类和接口来保持代码简洁。

 

  

与其他模式的关系

桥接模式、状态模式和策略模式(在某种程度上包括适配器模式)模式的接口非常相似。实际上,它们都基于组合模式——即将工作委派给其他对象,不过也各自解决了不同的问题。模式并不只是以特定方式组织代码的配方,你还可以使用它们来和其他开发者讨论模式所解决的问题。

 

  命令模式和策略看上去很像,因为两者都能通过某些行为来参数化对象。但是,它们的意图有非常大的不同。

  你可以使用命令来将任何操作转换为对象。操作的参数将成为对象的成员变量。你可以通过转换来延迟操作的执行、将操作放入队列、保存历史命令或者向远程服务发送命令等。另一方面,策略通常可用于描述完成某件事的不同方式,让你能够在同一个上下文类中切换算法。装饰模式可让你更改对象的外表,策略则让你能够改变其本质。

  模板方法模式基于继承机制:它允许你通过扩展子类中的部分内容来改变部分算法。策略基于组合机制:你可以通过对相应行为提供不同的策略来改变对象的部分行为。模板方法在类层次上运作,因此它是静态的。策略在对象层次上运作,因此允许在运行时切换行为。

  状态可被视为策略的扩展。两者都基于组合机制:它们都通过将部分工作委派给帮手对象来改变其在不同情景下的行为。策略使得这些对象相互之间完全独立,它们不知道其他对象的存在。但状态模式没有限制具体状态之间的依赖,且允许它们自行改变在不同情景下的状态。

  以上就是java设计模式策略模式图文示例详解的详细内容,更多关于java设计模式策略模式的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: