测试Duck的代码
①、输入并编译下面的Duck类,以及前面的MallardDuck类
public abstract class Duck{
// 为行为接口类型声明两个引用变量,所有鸭子子类都继承他们
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck(){
}
public abstract void display();
// 展示行为
public void performFly(){
// 委托给行为类
flyBehavior.fly();
}
public void performQuack(){
// 委托给行为类
quackBehavior.quack();
}
public void swim(){
System.out.println("All ducks can fly");
}
}
②、输入并编译FlyBehavior接口与两个行为实现类(FlyWithWings.java与FlyNoWay.java)
(FlyBehavior.java)
// 所有飞行行为类必须实现的接口
public interface FlyBehavior {
public void fly();
}
(FlyWithWings.java)
// 这是飞行行为的实现,给“真会”飞的鸭子用
public class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("I'm flying");
}
}
(FlyNoWay.java)
// 这是飞行行为的实现,给不会飞的鸭子用
public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("I can't fly");
}
}
③、输入并编译QuackBehavior接口与三个实现类(Quack,MuteQuack,Squeak)
(QuackBehavior.java)
// // 所有鸣叫行为类必须实现的接口
public interface QuackBehavior {
public void quack();
}
(Quack.java)
// 嘎嘎叫
public class Quack implements QuackBehavior{
public void quack(){
System.out.println("Quack");
}
}
(MuteQuack.java)
// 不会叫
public class MuteQuack implements QuackBehavior{
public void quack(){
System.out.println("Slience");
}
}
(Squeak.java)
// 吱吱叫
public class Squeak implements QuackBehavior{
public void quack(){
System.out.println("Squeak");
}
}
④、编译测试类DuckSimulator
public class DuckSimulator{
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
// 动态绑定行为测试
System.out.println("动态绑定行为测试:");
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPower());
model.performFly();
}
}
输出结果:
如果解决 MallardDuck类构造器中出现针对实现编程?用setter方法解决这个问题?