class Actor{
public void act(){System.out.println("Actor"); }
public void Things(){System.out.println("no things");}
}
class HappyActor extends Actor{
public void act(){System.out.println("HappyActor");}
public void Things(){System.out.println("some happy things^_^");}
}
class SadActor extends Actor{
public void act() {System.out.println("SadActor");}
public void Things(){System.out.println("some sad things-_-");}
}
class Stage{
public Actor actor = new HappyActor();
public void change() {actor = new SadActor();}
public void performPlay() {actor.act();}
}
public class Demo {
public static void main(String[] args) {
Stage stage = new Stage();
stage.performPlay();
stage.actor.Things();
stage.change();
stage.performPlay();
stage.actor.Things();
}
}
/*OutPut:
HappyActor
some happy things^_^
SadActor
some sad things-_-
*/
组合与继承:
从使用上来说:
组合更加强调的是在新类中使用现有类中接口功能而非接口。当把成员对象声明成private,调用者是不会知道这个类的结构是什么,仅仅得到的是新类中的一些接口,或者调用者仅仅知道这种类有哪些行为。如果将成员对象声明为public,可想而至也是非常有意义的一件事,这样调用者就会知道这个新类是由什么对象组成的,并且在调用的时候更加明白起内涵是什么。比如stage.actor.Things();(我们就会知道在这一阶段中状况,并且这个things行为是体现这个状况的。)
继承更加强调接口的重要性,继承基类并且在此基础上开发基类的导出类,所以说在没有特别强调两者类有明显的继承关系情况下,一般用组合。
从设计角度说:
组合有很好的动态灵活性(这也是基于多态的性质),因为我们完全可以在运行的时候决定继承不同的对象,(就像上述代码public Actor actor =new HappyActor();public void change() {actor = new SadActor();}完全可以设计程序,让程序中途调用change方法改变对象。)因此,这种方式不是是我们程序设计进入继承的层次结构中去。所以对于字段表达状态上的改变用组合。
继承就显得并不灵活,因为我们不能在运行期间改变不同的对象,因为继承必须在编译的时候既要确定对象是谁,采纳呢个进行前期的绑定。所以如何两个类有明确的继承关系而不仅仅是状态上的改变,用继承来表达他们之间的行为的差异。