摘要:我就不打算再学下去,我要继续学策略模式,指导能简单地解释它。策略模式定义定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
前言
策略模式定义爱因斯坦说过这样一句话:如果你不能简单地解释一样东西,说明你没真正理解它。(ps:如果爱因斯坦没说过,那可能是鲁迅说的......)所以,我写不出这篇文章。我就不打算再学下去,我要继续学策略模式,指导能简单地解释它。
例子定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
假如现在要做一款鸭子应用,作为一个OO程序员,这可不是一件难事。设计一个鸭子超类,再让它有"呱呱"叫、游泳的方法。
public class Duck{ public void quck(){ // some code } public void swim(){ // some code } //other function... }
然后让什么可达鸭、唐老鸭去继承超类。接着我们要做一件有趣的事,让鸭子会飞。在Duck类上加 fly() 方法。但是可怕的问题发生了......所有鸭子会飞了,包括"橡皮鸭"也在飞,而且诱饵鸭不会叫也不会飞。这可不是我们希望看到的。
利用接口如何?把"飞"、"呱呱叫"分离出来分别做成Flyable接口跟Quackable接口。但是java接口不具有实现代码的功能。难道还要给每个角色都去实现飞的功能,这样做就没有使代码达到"复用"的效果。
该怎么做呢?!先让我们回顾下‘策略’的定义 ,“...让算法的变化独立于使用算法的客户”。我们把"飞"啊、"呱呱叫"啊独立开来,只留下不需要变化的。做成一些行为接口,然后让Duck类用过行为类的类型。
public interface FlyBehavior{ fly(); } //会飞的行为类 public class FlyWithWings implements FlyBehavior () { public void fly() { System.out.println("i can flying..."); } } //不会飞的行为类 public class FlyNoWay implements FlyBehavior () { public void fly() { //nothing to do,can"t fly } }
public interface QuckBehavior{ quack(); } //呱呱叫行为类 public class Quack { //实现呱呱叫 } public class Squeak { //橡皮鸭吱吱叫 } //不会叫的...
现在我们将飞、叫delegate(委托)别人处理,而不是定义在Duck类中或者子类中。接着我们整理下代码。
public abstract class Duck { FlyBehavior flyBehavior; QuckBehavior quckBehavior; public void performFly() { flyBehavior.fly(); } public void performQuck() { quckBehavior.quack(); } }写在后面的
让我们再次回归定义,“定义了算法族,分别封装起来”,在这个例子中就是飞的行为、叫的行为。“让算法的变化独立于使用算法的客户”,客户需要一个会飞的鸭子就实现飞接口再实现飞的方法。需要叫就同理,这样去独立于使用算法。
我写得哪里不好,请大神说出来,我会改正的。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67975.html
摘要:策略模式介绍策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。使用策略模式的好处策略模式提供了管理相关的算法族的办法。使用策略模式可以避免使用多重条件转移语句。 你好,是我琉忆,PHP程序员面试笔试系列图书的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面试常考之设计模式——工...
摘要:设计模式与开发实践读书笔记。策略模式可以有效避免多重条件选择语句。当然,策略模式也有一些缺点增加了许多策略类或者策略对象。要使用策略模式,必须了解所有的,违反了最少知识原则。至此,回家咯附设计模式之发布订阅模式观察者模式 《JavaScript设计模式与开发实践》读书笔记。这本书挺好的,推荐。 俗话说,条条大路通罗马。在现实生活中,我们可以采用很多方法实现同一个目标。比如我们先定个小目...
摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。一、定义定义(维基百科...
阅读 917·2021-11-24 09:39
阅读 3313·2021-10-27 14:20
阅读 2301·2019-08-30 14:08
阅读 3320·2019-08-29 16:34
阅读 2146·2019-08-26 12:14
阅读 2083·2019-08-26 11:54
阅读 2754·2019-08-26 11:44
阅读 2451·2019-08-26 11:38