用继承(inheritance)和组合(composition)设计
继承
子类通过is-a 继承的关系表达行为的差异,如HappyActor的act行为具有happy特性,SadActor的act具有sad的特性,具体例子如下:
- 抽象父类Actor:
public abstract class Actor {
public abstract void act();
}
- HappyActor子类:
public class HappyActor extends Actor {
@Override
public void act() {
// TODO Auto-generated method stub
System.out.println("happy act");
}
}
- SadActor子类
public class SadActor extends Actor {
@Override
public void act() {
// TODO Auto-generated method stub
System.out.println("sad act");
}
}
组合
组合在利用已有的类设计新类的时候,尤其是不确定具体的继承关系时,首先应该考虑到的技术,它让我们摆脱继承的层次关系,更灵活地选择需要的类型(这个需要的类型可以通过继承来构造)。下面的例子就是通过用组合的方式修改了自己字段的状态,并用字段的改变表达状态上的变化。例子如下:
public class Stage {
/**
* 在不确定自己使用哪种方式act的时候,Stage通过组合的方式,灵活的改变字段actor的状态,相比于继承的方式,组合的方式能够在运行
* 期间绑定不同的对象,而继承是要求在编译期就确定下来类与类之间的层次关系,不可以动态的修改Actor类型(
* 是HappyActor还是SadActor)
*/
private Actor actor = new HappyActor();
/**
* 运行期间绑定不同的对象,获得了动态的灵活性,再设计模式中这被称为状态模式
*/
public void change() {
// 改变状态,使用了多态,actor引用绑定到新建的SadActor对象中去,这时候actor的act方法表现出SadActor的行为
actor = new SadActor();
}
/**
* 状态的改变导致行为发生改变,舞台上表演由HappyActor表演动作(happy act)转变成SadActor表演动作(sad act)
*/
public void perform() {
actor.act();
}
/**
* 模拟改变角色的行为
* @param args
*/
public static void main(String[] args) {
Stage stage = new Stage();
stage.perform();
stage.change();// 修改状态,导致下面perform的行为发生改变
stage.perform();
}
}
输出:
happy act
sad act
结果表明使用组合和继承的方式,将舞台的表演方式由happy act动态地转成sad act.下面引用thinking in Java中的一句话,用继承表达行为的差异,用字段表达状态的变化:
Use inheritance to express differences in behavior, and fields to express variations in state