用继承(inheritance)和组合(composition)设计

本文通过实例探讨了面向对象设计中的两种核心概念:继承与组合。继承通过子类继承父类的方法来表达行为差异,而组合则通过组合不同类的对象来表达状态变化,实现了更加灵活的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用继承(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值