3

在阅读抽象时,我遇到了以下声明

“抽象仅捕获与当前视角相关的对象的那些细节”

例如。从驾驶员的角度来看,汽车类将是

  public class Car
  {
     void start();
     void applybrakes();
     void changegear();
     void stop();
   }

从机械师的角度来看,汽车类将是

  public class Car
  {
     void changeOil();
     void adjustBrakes();
   }

我的问题是,在设计系统时,我们是为一个用户视角(驾驶员或机械师)设计,还是我们可以为多个用户视角设计并根据用户类型进一步抽象?

希望我的问题很清楚。

谢谢

4

2 回答 2

6

根据您的用例,您可能需要为多个用户设计。在您的示例中,如果您的汽车将由机械师和驾驶员使用,那么您不能只忽略一组用户。在这种情况下,您仍然可以使用接口抽象细节。

你可以这样设计你的对象:

interface IDrivable {
    void start();
    void applyBrakes();
    void changeGear();
    void stop();
}

interface IFixable {
    void changeOil();
    void adjustBrakes();
}

public class Car : IDrivable, IFixable {
    // implement all the methods here
}

现在,当一个机械师想要这辆车时,你不给他一个Car对象,而是给他一个IFixable对象。同样,驱动程序得到一个IDrivable对象。这可以同时为两组用户保持相关的抽象。

class Driver {

    private IDrivable car;

    public Driver(IDrivable car) {
        this.car = car;
    }

    public driveCar() {
        this.car.start();
        this.car.accelerate();

        //this is invalid because a driver should not be able to do this
        this.car.changeOil();
    }
}

同样,技工将无法访问接口中的方法IDrivable

您可以在此处阅读有关接口的更多信息。尽管这是 MSDN 链接并使用 C#,但所有主要语言都支持接口。

于 2013-01-13T23:59:44.353 回答
1

我认为您可能从“角度”推断得太多。我不会在这里将视角视为一个人或用户,而是一个有利位置。这里的视图概念可能甚至不是一个好的比喻。我们在这里真正谈论的是我们用来组成较大对象的较小对象之间的责任划分。

这个想法的重点是解耦和模块化。您需要可以拉出和替换的对象,而无需更改它们周围的一切。所以你希望你的对象是连贯的,因为它们的方法和变量是密切相关的。

在对象之间的接口-客户端关系方面,您可能能够从用户隐喻中获得一些信息。

于 2013-01-14T00:06:27.423 回答