如果想为Duck添加多种行为为不修改Duck的话也是可以的,见以下:
【UML】见下图
【相关代码】
[Duck.java]
public abstract class Duck {
public List behaviors;
public Duck(){}
public void swim(){
System.out.println("所有鸭子都会游泳");
}
public abstract void display();
public void performAction(){
Iterator it=behaviors.iterator();
while(it.hasNext()){
Behavior b=it.next();
b.action();
}
}
}
=================================================================
[Behavior.java]
public interface Behavior {
public void action();
}
=================================================================
[FlyWithWings.java]
public class FlyWithWings implements FlyBehavior {
public void action() {
System.out.println("使用翅膀飞翔");
}
}
=================================================================
[BehaviorTest.java]
public class BehaviorTest {
public static void main(String[] args) {
//定义行为
List behaviors=new ArrayList();
behaviors.add(new FlyNoWay());
//behaviors.add(new FlyWithWings());
behaviors.add(new Squeak());
//为对象添加行为
Duck duck1=new RubberDuck(behaviors);
duck1.swim();
duck1.display();
duck1.performAction();
}
}
【结果显示】
所有鸭子都会游泳
橡皮鸭
不会飞
叽叽
当想添加新的行为,只需要实现FlyBehavior或QuackBehavior接口,然后在对象中添加行为就可以了,[对象]与[行为]分割开来,不互相影响。
[注]不过这样设计对于行为类的方法命令有污染(被统一命名了,混淆了不同行为类的行为用意),还是不建议使用。
[该贴被seagar于2009-04-01 16:39修改过]
