OO设计问题

时间:2011-07-25 01:55:27

标签: oop

假设有两个类:AB

A可以在B上运行。

我需要能够查询B已经操作过的所有A个实例。

对于特定的B实例,我需要能够查询已在其上运行的所有A个实例。

这种问题的优雅(在OO味道......)解决方案是什么?

2 个答案:

答案 0 :(得分:1)

在像Java这样的语言中,我会做类似的事情:

package com.whatever.blah;

public class A {
    private Set<B> patients = new HashSet<B>;

    public void operateOn(B patient) {
        patient.startRecoveringFromOperation(this);
        patients.add(patient);
    }

    public List<B> getPatients() {
        return patients;
    }
}

public class B {
    private Set<A> surgeons = new HashSet<A>;

    //this has package access to `A` can access it but other classes can't
    void startRecoveringFromOperation(A theSurgeon) {
        surgeons.add(theSurgeon);
    }

    public List<A> getSurgeons() {
        return surgeons;
    }
}

除了使用package access允许A访问B的{​​{1}}方法,同时从大多数其他类中隐藏方法之外,这确实没有做任何特别的事情。在其他语言中,您可以使用不同的方法来实现此目的。例如,在C ++中,您可以将startRecoveringFromOperation()声明为A friend

答案 1 :(得分:0)

import java.util.*;
class A {
    void operate(B b) {
        operatedOn.add(b);
        b.operatedOnBy.add(this);
    }
    final Set<B> operatedOn = new HashSet<B>();
}
class B {
    final Set<A> operatedOnBy = new HashSet<A>();
}
public class Main {
    public static void main(String[] args) {
        A a=new A();
        B b=new B();
        a.operate(b);
        System.out.println(a+" "+a.operatedOn);
        System.out.println(b+" "+b.operatedOnBy);
    }
}