gpt4 book ai didi

java - 组合、转发和包装

转载 作者:行者123 更新时间:2023-12-01 14:29:00 28 4
gpt4 key购买 nike

关于“优先组合而不是继承”的问题,我的老师是这样说的:

  • 组合:现有类成为新类的组件
  • 转发:新类中的每个实例方法,在现有类的包含实例上调用相应的方法并返回结果
  • 包装器:新类封装了现有的

  • 这三个概念我不是很了解,所以尝试写下一些代码:
    //Composition is this
    Class A{
    public void doSomething(){
    //do some code
    }
    }

    Class B{
    A a = new A();
    public void doOther(){
    a.doSomething(); //this is forwarding
    }
    }

    那么什么是包装呢?

    最佳答案

    你的第一个例子不是组合。

    Composition是 2 个对象之间的“has-a”关系,其中一个对象(组合对象)是另一个(所有者)的字段成员。

    组成将是:

    class DemoA {
    DemoB b; //composition
    }

    我们会说“DemoA 由 DemoB 组成”。

    如果 DemoB对象在 DemoA 时仍然可用变得不可达,我们考虑 DemoB成为 aggregated .例如,尽管 key 环可能已被破坏,但仍然可以使用 key 。 key 环将由 key 组成,但不拥有它们,这表示聚合。

    您的转发示例看起来不错,尽管要求确实说“返回结果”,这可能表明方法不应为空:
    class DemoA {
    private DemoB b;

    public int doSomething() {
    return b.doSomething(); //forwarding/delegating
    }
    }

    至于包装器,它们封装了对象的行为,暴露了新的(通常是更复杂的)行为。一个例子是 DataInputStream ,它包装了一个 InputStream让您阅读 String对象和更多,当 InputStream只能处理原始数据。
    class DemoB {
    public int read() {
    //...Read one int of data
    }
    }

    class DemoA {
    private DemoB b;

    public DemoA(DemoB b) {
    this.b = b;
    }

    public List<Integer> readUntil(List<Integer> dataList, Supplier<Boolean> condition) {
    while(condition.get())
    dataList.add(b.read());

    return dataList;
    }
    }

    在本例中, DemoA包裹 DemoB揭露 readUntil行为,某事 DemoB做不到。

    这是一个有点愚蠢的例子,但希望能表达出这一点:我们的 DemoB object 不能执行我们需要的行为 (readUntil),因此我们将其包装在为我们处理行为的类型中,因此我们不会不断重写此类行为。

    关于java - 组合、转发和包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42029992/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com