资讯专栏INFORMATION COLUMN

设计模式之策略模式

shixinzhang / 3072人阅读

摘要:我就不打算再学下去,我要继续学策略模式,指导能简单地解释它。策略模式定义定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

前言

爱因斯坦说过这样一句话:如果你不能简单地解释一样东西,说明你没真正理解它。(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面试常考设计模式——策略模式

    摘要:策略模式介绍策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。使用策略模式的好处策略模式提供了管理相关的算法族的办法。使用策略模式可以避免使用多重条件转移语句。 你好,是我琉忆,PHP程序员面试笔试系列图书的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面试常考之设计模式——工...

    Drinkey 评论0 收藏0
  • JavaScript设计模式策略模式

    摘要:设计模式与开发实践读书笔记。策略模式可以有效避免多重条件选择语句。当然,策略模式也有一些缺点增加了许多策略类或者策略对象。要使用策略模式,必须了解所有的,违反了最少知识原则。至此,回家咯附设计模式之发布订阅模式观察者模式 《JavaScript设计模式与开发实践》读书笔记。这本书挺好的,推荐。 俗话说,条条大路通罗马。在现实生活中,我们可以采用很多方法实现同一个目标。比如我们先定个小目...

    go4it 评论0 收藏0
  • 设计模式策略模式

    摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。一、定义定义(维基百科...

    番茄西红柿 评论0 收藏0
  • 设计模式策略模式

    摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。一、定义定义(维基百科...

    番茄西红柿 评论0 收藏0
  • 设计模式策略模式

    摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。一、定义定义(维基百科...

    MangoGoing 评论0 收藏0

发表评论

0条评论

shixinzhang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<