文章目录
- 前言
- 传统方式解决鸭子问题
- 完整代码
- 抽象鸭子类
- 野鸭子类
- 北京鸭子类
- 玩具鸭子类
- 一、策略模式基本介绍
- 二、策略模式解决鸭子问题
- 完整代码
- 飞翔接口 FlyBehavior
- 飞翔接口的子类实现
- 飞翔技术高超 GoodFlyBehavior
- 不会飞翔 NoFlyBehavior
- 飞翔技术一般 BadFlyBehavior
- 其他行为接口 QuackBehavior
- 抽象鸭子类 Duck
- 野鸭 WildDuck
- 北京鸭 PekingDuck
- 玩具鸭 ToyDuck
- 测试类 Client
- 三、策略模式在JDK-Arrays 应用的源码分析
- 四、策略模式的注意事项和细节
前言
传统方式解决鸭子问题
完整代码
抽象鸭子类
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();
}
}
输出
飞翔技术高超 ~~~
不会飞翔
飞翔技术一般
北京鸭的实际飞翔能力
不会飞翔