文章目录
前言
传统方式解决鸭子问题
完整代码
抽象鸭子类
package tanchishell.SJMS.strategy;
public abstract class Duck {
public Duck() {
}
public abstract void display();//显示鸭子信息
public void quack() {
System.out.println("鸭子嘎嘎叫~~");
}
public void swim() {
System.out.println("鸭子会游泳~~");
}
public void fly() {
System.out.println("鸭子会飞翔~~~");
}
}
野鸭子类
package tanchishell.SJMS.strategy;
public class WildDuck extends Duck {
@Override
public void display() {
System.out.println(" 这是野鸭 ");
}
}
北京鸭子类
package tanchishell.SJMS.strategy;
public class PekingDuck extends Duck{
@Override
public void display() {
System.out.println("~~北京鸭~~~");
}
//因为北京鸭不能飞翔,因此需要重写 fly
@Override
public void fly() {
System.out.println("北京鸭不能飞翔");
}
}
玩具鸭子类
package tanchishell.SJMS.strategy;
public class ToyDuck extends Duck {
@Override
public void display() {
System.out.println("玩具鸭");
}
//需要重写父类的所有方法
public void quack() {
System.out.println("玩具鸭不能叫~~");
}
public void swim() {
System.out.println("玩具鸭不会游泳~~");
}
public void fly() {
System.out.println("玩具鸭不会飞翔~~~");
}
}
一、策略模式基本介绍
二、策略模式解决鸭子问题
完整代码
飞翔接口 FlyBehavior
package tanchishell.SJMS.strategy.improve;
public interface FlyBehavior {
void fly(); // 子类具体实现
}
飞翔接口的子类实现
飞翔技术高超 GoodFlyBehavior
package tanchishell.SJMS.strategy.improve;
public class GoodFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println(" 飞翔技术高超 ~~~");
}
}
不会飞翔 NoFlyBehavior
package tanchishell.SJMS.strategy.improve;
public class NoFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println(" 不会飞翔 ");
}
}
飞翔技术一般 BadFlyBehavior
package tanchishell.SJMS.strategy.improve;
public class BadFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println(" 飞翔技术一般 ");
}
}
其他行为接口 QuackBehavior
package tanchishell.SJMS.strategy.improve;
public interface QuackBehavior {
void quack();//子类实现
}
抽象鸭子类 Duck
package tanchishell.SJMS.strategy.improve;
public abstract class Duck {
//属性, 策略接口
FlyBehavior flyBehavior;
//其它属性<->策略接口
QuackBehavior quackBehavior;
public Duck() {
}
public abstract void display();//显示鸭子信息
public void quack() {
System.out.println("鸭子嘎嘎叫~~");
}
public void swim() {
System.out.println("鸭子会游泳~~");
}
public void fly() {
//改进
if (flyBehavior != null) {
flyBehavior.fly();
}
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
野鸭 WildDuck
package tanchishell.SJMS.strategy.improve;
public class WildDuck extends Duck {
//构造器,传入 FlyBehavor 的对象
public WildDuck() {
flyBehavior = new GoodFlyBehavior();
}
@Override
public void display() {
System.out.println(" 这是野鸭 ");
}
}
北京鸭 PekingDuck
package tanchishell.SJMS.strategy.improve;
public class PekingDuck extends Duck {
//假如北京鸭可以飞翔,但是飞翔技术一般
public PekingDuck() {
flyBehavior = new BadFlyBehavior();
}
@Override
public void display() {
System.out.println("~~北京鸭~~~");
}
}
玩具鸭 ToyDuck
package tanchishell.SJMS.strategy.improve;
public class ToyDuck extends Duck {
public ToyDuck() {
flyBehavior = new NoFlyBehavior();
}
@Override
public void display() {
System.out.println("玩具鸭");
}
//需要重写父类的所有方法
public void quack() {
System.out.println("玩具鸭不能叫~~");
}
public void swim() {
System.out.println("玩具鸭不会游泳~~");
}
}
测试类 Client
package tanchishell.SJMS.strategy.improve;
public class Client {
public static void main(String[] args) {
WildDuck wildDuck = new WildDuck();
wildDuck.fly();//
ToyDuck toyDuck = new ToyDuck();
toyDuck.fly();
PekingDuck pekingDuck = new PekingDuck();
pekingDuck.fly();
//动态改变某个对象的行为, 北京鸭 不能飞
pekingDuck.setFlyBehavior(new NoFlyBehavior());
System.out.println("北京鸭的实际飞翔能力");
pekingDuck.fly();
}
}
输出
飞翔技术高超 ~~~
不会飞翔
飞翔技术一般
北京鸭的实际飞翔能力
不会飞翔