这是策略模式(java,ducks的fly方法)的正确实现吗?

cunj1qz1  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(425)

我只想快速查看一下我是否正确地执行了不同的飞行策略。
这个程序只是由一个duck类组成,该类使用一个接口作为它的fly方法。接口有不同的实现(即simplefly和nofly),switch语句根据specie enum选择正确的方法。
据我所知,strategy模式旨在避免在同一级别的子类之间出现重复代码,从而降低可维护性和可扩展性。因此,我们将相关的算法抽象到接口中,并根据需要进行选择。
代码:

package DesignPatterns;

//Here we will separate the fly method of ducks into implementations of an internface and then instantiate ducks with those attributes

interface IFly {

    public void fly();

}

//These are called strategies
class SimpleFly implements IFly {

    @Override
    public void fly() {
        System.out.println("Quack Quack i am flying in the air");
    }

}

class NoFly implements IFly {

    @Override
    public void fly() {
        System.out.println("I cannot fly.");
    }

}

//Now the base class just has to implement one of these strategies
class Duck {

    private IFly flyType;

    public enum SPECIE {
        WILD, CITY, RUBBER
    }

    public Duck(SPECIE specie) {
        switch(specie) {

            //Here just select the algorithms you want to assign to each type of DUCK. More flexible than horizontal code between species.
            case WILD:
            case CITY:
                this.flyType = new SimpleFly();
                break;
            case RUBBER:
                this.flyType = new NoFly();
                break;
            default:
                //If a new enum is defined but no definition yet, this stops code from breaking
                this.flyType = new SimpleFly();
        }
    }

    public void fly() {
        flyType.fly();
    }

}

输出正确,如本例所示:

Duck rubberDuck = new Duck(Duck.SPECIE.RUBBER);
        Duck normalDuck = new Duck(Duck.SPECIE.WILD);

        rubberDuck.fly();
        normalDuck.fly();

产量:

I cannot fly.
Quack Quack i am flying in the air

提前谢谢你,请让我知道我知识上的任何差距,sshawarma

wkyowqbh

wkyowqbh1#

我要指出语义和术语的几个问题。
有一个名为 fly 可以实现为不飞行。命名方法 tryToFly 或者将这种方法记录为仅仅是一种尝试,这是解决这种混乱的两种方法。这里引用的软件原理是liskov替换。
基类没有实现其中一个策略;相反,它构成了一种战略。策略模式的目的是避免通过组合进行子类化。
重申其中一条评论, Duck 应接受的示例 IFly 直接在其构造函数(或setter方法)中,而不是打开枚举。策略模式的另一个目标是避免分支逻辑。
该模式的本质是避免了创建多个子类 Duck 而是通过创建 IFly . 这样做的好处是 IFly 实现可以在没有复杂继承层次结构的情况下重用,例如。 WILD 以及 CITY 可以分享一个策略。
正如在评论中提到的,策略还有一个优点,即 Duck 可能在运行时改变策略。例如, IFly 可能由实现 Soar 以及 Glide 所以 Duck 会根据风向在不同的策略之间切换。

相关问题