**思路:将一类行为不同形式与鸭子这个本体脱离关系,灵活一点
**
import java.util.*;
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 Duck can swim!"); //对比方法,因为所有鸭子都有此行为唯一的表现显示,所以固定
}
public void setFlyBehavior(FlyBehavior fb){ //设置实例指向的对象
flyBehavior=fb;
}
public void setQuackBehavior(QuackBehavior qb){
quackBehavior=qb;
}
}
//**********************************************************输入类
class ModeDuck extends Duck{
public ModeDuck(){
flyBehavior = new FlyNoWay(); //将鸭子的实例变量flyBehavior指向实现FlyBehavior接口的具体实现类FlyNoWay;
quackBehavior = new Quack();
}
public void display(){
System.out.println("I am model duck");
}
}
/************************************* 接口 *************************************/
interface FlyBehavior{
public void fly(); //所有飞行类都必须实现的接口
}
//接口——————实现类1
class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("I am flying!");
}
}
//接口——————实现类2
class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("I can 't fly!");
}
}
class FlyROCK implements FlyBehavior{
public void fly(){
System.out.println("I can 't ROCKfly!");
}
}
interface QuackBehavior{ //所有叫声都应该实现的接口
public void quack();
}
//接口——————实现类3
class Quack implements QuackBehavior{
public void quack(){
System.out.println("Quack");
}
}
//接口——————实现类4
class MetuQuack implements QuackBehavior{
public void quack(){
System.out.println("<<Silence>>");
}
}
//接口——————实现类5
class Squack implements QuackBehavior{
public void quack(){
System.out.println("Squack");
}
}
//
class test{
public static void main(String[] args){
Duck duck1 = new ModeDuck();
duck1.performFly();
duck1.performQuack();
duck1.setFlyBehavior(new FlyROCK());
}
}