1

在此处输入图像描述请不要介意我的问题,因为它有点理论。

上周我接受了一个工作面试,我被分配了一个任务,后来他们问了问题,我的设计有问题。所以我没能得到这份工作。我正在分享我的设计。请查看它并建议我哪里错了,什么解决方案将是一个好的设计。

问题 这是为建造游泳池的建筑公司提供的软件包。游泳池有 2 个部分的游泳池周边区域和游泳池。两者(游泳池和周边区域)都可以是矩形或圆形(请参见附图),因此将有 4 种可能的形状。程序应计算阴影面积(水池到混凝土的外部区域)。

****公式**计算矩形面积**是长*宽*2 计算圆形面积的公式是2 * 2.1718

我的设计 我用 2 种方法(1)CalculateCircularArea(2)CalculateRectangularArea 制作了 IPool 接口。制作了 2 个实现 IPool 接口的类(CircularPool、RectangularPool)。

问题 如果除了矩形和圆形之外还有更多的形状怎么办?假设有 100 种其他形状,未来的招股说明书会考虑什么解决方案?在这里,我的设计并不好,因为当新形状出现时需要更改界面。

4

3 回答 3

5

问题中已经给出了设计:一个游泳池有一个环境,它有一个内部游泳池。该任务需要组合而不是继承。

有了这个设计,我们可以发明其他的游泳池形状和环境,并且仍然有游泳池

public interface SwimmingPool {
  Surrounding getSurrounding();
  Pool getPool();
  double getOuterArea();
}

public interface Surrounding extends Shape{
  // some methods for surroundings
}

public interface Pool extends Shape {
  // some methods for pools
}

public interface Shape {
   double getArea();
}

接下来,您为矩形和圆形游泳池创建具体类,并使用这些模块来设计游泳池。


现在,我们创建一个具体的游泳池类:

public SwimmingPoolImpl implements SwimmingPool {
 private Surrounding surrounding;
 private Pool pool;
 public SwimmingPoolImpl(Surrounding surrounding, Pool pool) {
   this.surrounding = surrounding;
   this.pool = pool;
 }

 public double getOuterArea() {
   return surrounding.getArea() - pool.getArea();
 }

 public Surrounding getSurrounding() { return surrounding; }
 public Pool getPool() { return pool; }
}

想象一下,我们有一个包含几十个不同游泳池和环境的库,我们想要创建一个自定义游泳池:

SwimmingPool customPool = new SwimmingPoolImpl(new OvalSurrounding(), new StarShapedPool());
double pavementArea =  customPool.getOuterArea();

而已。现在我们可以维护一个包含不同游泳池和外部区域的库,并立即使用它们来创建游泳池,而无需更改游泳池的实现。这就是组合的好处。

于 2012-02-27T11:42:46.847 回答
1

子类化的典型案例。设计一个Shape带有抽象函数的抽象类getArea(),并为您必须处理的每种可能的形式创建一个具体的子类。

Pool或者SurroundingArea只需要打电话getArea(),像这样:

public class SwimmingPool {
   Shape pool;
   Shape surrounding;

   public double geArea() {return pool.getArea() + surrounding.getArea()}
}

public abstract class Shape {
   public abstract double getArea();
}

public class Circle extends Shape {
   public double getArea() {
     // implementation of area calculation of circles
   }
}

public class Square extends Shape {
   public double getArea() {
     // implementation of area calculation of squares
   }
}

...

对于其他形状的水池或周围环境,您只需要设计另一个 Shape 的子类。

于 2012-02-27T11:40:25.850 回答
1

我认为更好的设计是有一个类似IShape接口的东西来公开getArea()方法。(或者,更好的是,将其作为财产)。

这样,您的两个“对象”都实现了这样的接口,您可以通过简单地取getArea().

于 2012-02-27T11:41:36.533 回答