【问题标题】:Java Bridge Pattern IssueJava 桥模式问题
【发布时间】:2015-02-15 16:43:41
【问题描述】:

我正在研究桥接模式,并没有什么疑问。我从一个网站获得了以下代码,在该网站我创建了一个抽象类作为接口。

abstract class Vehicle {
    protected Workshop workShop1;
    protected Workshop workShop2;

    protected Vehicle(Workshop workShop1, Workshop workShop2) {
        this.workShop1 = workShop1;
        this.workShop2 = workShop2;
    }

    abstract public void manufacture();
}


public interface Workshop {
    abstract public void work();
}

我们为什么要创建一个构造函数来为接口声明 2 个对象?

public class Car extends Vehicle {

    public Car(Workshop workShop1, Workshop workShop2) {
        super(workShop1, workShop2);
    }


    @Override
    public void manufacture() {
        System.out.print("Car ");
        workShop1.work();
        workShop2.work();

    }

}

同样的,为什么要在传递接口的引用对象时再次声明构造函数?

【问题讨论】:

  • 你有什么问题?
  • 为什么我们创建了一个构造函数来为接口声明 2 个对象?我无法理解这件事
  • 能否也分享一下教程链接
  • 我根本不认为该教程具有启发性。他们似乎提出了一个微不足道的案例,在我看来,它本身甚至不是一个好的案例。自行车的制造过程应该与汽车的制造过程有很大不同。您不能使用任何随机的 Workshop 对象来创建您的自行车/汽车对象,因此我看不到已解耦的内容。

标签: java design-patterns interface abstract-class


【解决方案1】:

接口定义了一个通用对象的接口。所有实现接口的对象必须实现接口中定义的方法。所以你有一个Car 类,它扩展了你的abstract class Vehicle,因此必须实现void manufacture() 方法。此外,扩展Vehicle 的类会获得抽象类中定义的变量。此外,扩展类必须调用抽象类中定义的构造函数之一(如果没有定义构造函数,则无需调用任何东西)。

Vehicle 有一个带有两个 Workshop 对象的构造函数,这意味着当您尝试实例化任何车辆(即Car)时,您必须 提供实现Workshop 接口的对象。

您的难题中缺少的部分是实现Workshop 接口的具体类。作为一个简单的例子,如果你有:

public class NoWork implements Workshop{
    @Override
    public void work(){
        // do no work
    }
}

然后您可以通过以下方式实例化您的 Car 类(例如):

public static void main(String ...args){
    final Workshop noWork1 = new NoWork();
    final Workshop noWork2 = new NoWork();
    final Vehicle car = new Car(noWork1, noWork2);
}

请注意,由于NoWork 实现了Workshop,它也是 类型为Workshop,因此将noWork1(和2)声明为Workshop 对象事件是合法的,尽管它们实际上是NoWork 对象。同样,请注意,由于Car 扩展了Vehicle,因此发现将car 声明为Vehicle,即使它实际上是Car(但请记住Car Vehicle )。

只是澄清一下,您不一定需要为每个扩展类提供两个Workshop 类到Vehicle,您可以有类似的东西:

public class NoVehicle extends Vehicle{
    public NoVehicle(){
        super(null, null);
    }

    @Override
    public void manufacture(){
        // do nothing...there's nothing to be done
    }
}

但请注意,any 扩展类必须调用超级构造函数。

【讨论】:

  • 正是 Jared 非常感谢您的解释。缺少的课程已经从我学习教程的地方开始了。我感到困惑的一点是构造函数的要求是否必须要有一个?并且专门针对这种模式?
  • Vehicle 有一个带有两个 Workshop 对象的构造函数,这意味着当您尝试实例化任何车辆(即 Car)时,您必须提供实现 Workshop 接口的对象。这是我的回答,感谢您的解释:)
【解决方案2】:

如果您在教程link 中看到桥接模式图,他们认为有两种类型的车间

  1. 制片人
  2. 组装

所以他们使用了两个车间接口,一个用于生产者,一个用于组装。

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2013-05-31
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多