java - 组合、转发和包装

标签 java composition

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

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

  • 这三个概念我不是很了解,所以尝试写下一些代码:
    //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/

    相关文章:

    Java bean 验证

    java - 从 PDF 中一张一张检索条形码图像

    java - 线程 "main"java.lang.NoSuchMethodError : <method> 中的 JNI GetMethodID 异常

    .net - 基类中的 MEF 的 ImportMany 从所有程序集中导入所有导出 - 如何防止这种情况发生?

    java - 在 Java 中设置 Map<K,V> 中的 <T>

    java - 如何返回一个字符串?

    java - 按下箭头键时如何防止JScrollPane滚动

    function - 在 Haskell 中组合两个错误引发函数

    go - Go中如何正确使用组合

    java - 在 Java 中实现组合