java - 正确使用聚合(OOP)以电子电路类为例

标签 java android oop

我在如何使用正确的 OOP 实践组织我的代码时遇到了问题。

假设我有一个由电阻器和电池等元件组成的电子电路。

我肯定想要一个类来分析整个电路的属性。但也有一些组件的属性是整个电路并不“关心”的。

我的问题是我的电池和电阻类应该如何与电路类交互?

我在下面编写了一些示例代码,它们有望说明我正在尝试做的事情。请更正/评论实现!

public class Circuit{
     public double current;
     public double supplyVoltage;
     public int numResistors;

     public double batteryVoltage(){
          //Create battery object here? Or in its own method?
          return supplyVoltage;
          }

     public double voltageDropAcrossResistor(){
          //Use V=I*R

          //Would I create Resistor objects here? Or create a method?
          //Does the circuit object 'remember' resistor objects
          //that were created elsewhere?
     }


}

public class Resistor{
     public int resistance;

     public void setResistance(int resistance){
         this.resistance = resistance;
     }
     public int getResistance(){
         return resistance;
     }
     public String getColorCode(){
         String color = someFormula; 
         return color; 
     }

}

public class Battery{
    public int voltage;
    public String batteryType;

    public void setVoltage(int voltage){
        this.voltage = voltage; 
    }
    public int getVoltage(){
       return voltage;
    }
    public void setBatteryType(String type){
        this.batteryType = type;
    }
    public String getBatteryType(){
        return batteryType; 
    }

}

最佳答案

好吧,问题是 Circuit 没有在您的设计中聚合一个 Battery 和一堆 Circuit

我期望对象引用如:

public class Circuit {
    private Battery battery;
    private List<Resistor> resistors;

    public Circuit(Battery battery, List<Resistor> resistors) {
        //...
    }

鉴于这种聚合,电路 可以向电池询问它的电压,也可以得到它的电阻器的电阻以计算电压降。

My question is how should my battery and resistor classes interact with the circuit class?

通常不需要也不希望双向关系,尤其是对于聚合,因为子项具有独立于父项的生命周期。在这种情况下,电池或电阻器可能根本不需要知道电路。但是,它们必须提供足够的公共(public)接口(interface)来为电路(或使用它们的任何其他组件)提供服务。

顺便说一句,如果您不需要电池或电阻器有自己的生命周期,您应该更愿意谈论组合而不是聚合。

关于java - 正确使用聚合(OOP)以电子电路类为例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100589/

相关文章:

来自 Vertx 和 AMQPBridge 的 Java 运行时警告

java - 使 Javascript 函数可用于 Java 代码

java - 如何在单击按钮时将数据写入特征?

java - 在 Scala 中实现抽象类

java - 使用哪种设计模式(如果存在)?

java - 如何使用 snmp4j 代理创建自己的 snmp 模拟器?

java - 覆盖 ZipEntry

java - 无法解析符号注释设计 ActivityCompat v7

android - 谷歌地图 Android API v2 : GooglePlayServicesNotAvailableException not thrown anymore

PHP OOP核心框架