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