如果有公共行为,可以定义在父类中,达到代码复用。
如果有个人行为,可以定义接口或抽象方法,在实现类中实现。
如果某些行为可以被一类对象复用(不是所有对象),就可以定义为策略。 不同的实现类注入想要的策略即可。
策略:
/**
* 鸭子飞行策略
*
* @author: growingduck
* @Date: 2021/07/10
*/
public interface FlyBehavior {
void fly();
}
/**
* 飞的高
*
* @author: growingduck
* @Date: 2021/07/10
*/
public class HighFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("I can fly very high!");
}
}
/**
* 飞的低
*
* @author: growingduck
* @Date: 2021/07/10
*/
public class LowFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("I can fly a litle!");
}
}
使用者:
/**
* 基类
*
* @author: growingduck
* @Date: 2021/07/10
*/
public abstract class Duck {
/**
* 飞行行为是一种策略,同一类鸭子可以注入同一种策略
*/
private FlyBehavior flyBehavior;
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
/**
* 所有鸭子都会游泳
*/
public void swim() {
System.out.println("I can swim!");
}
/**
* 每个鸭子显示的样子、颜色不一样,需要各自实现
*/
public abstract void display();
/**
* 不同类鸭子有不同的飞行方式(同一类有相同的方式),所以同一类鸭子就是用一种策略
*/
public void fly() {
flyBehavior.fly();
}
}
/**
* 红色鸭子飞的高
*
* @author: lifan2@tinman.cn
* @Date: 2021/07/10
*/
public class RedDuck extends Duck{
@Override
public void display() {
System.out.println("I am a red duck!");
}
}
/**
* 黄色鸭子飞的低
*
* @author: lifan2@tinman.cn
* @Date: 2021/07/10
*/
public class YellowDuck extends Duck{
@Override
public void display() {
System.out.println("I am a yellow duck!");
}
}
测试:
给不同的鸭子注入不同的策略
public class Test {
public static void main(String[] args) {
Duck yellowDuck = new YellowDuck();
yellowDuck.setFlyBehavior(new LowFlyBehavior());
yellowDuck.swim();
yellowDuck.display();
yellowDuck.fly();
System.out.println("------------------------------");
Duck redDuck = new RedDuck();
redDuck.swim();
redDuck.setFlyBehavior(new HighFlyBehavior());
redDuck.display();
redDuck.fly();
}
}
I can swim!
I am a yellow duck!
I can fly a litle!
------------------------------
I can swim!
I am a red duck!
I can fly very high!
4587

被折叠的 条评论
为什么被折叠?



