Java Bridge Pattern问题

时间:2014-12-17 07:38:53

标签: java design-patterns interface abstract-class

我正在浏览Bridge模式并且很少有人怀疑。我从一个网站下面的代码中创建了一个abstarct类作为接口。

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 个答案:

答案 0 :(得分:0)

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

Vehicle有一个带有两个Workshop对象的构造函数的事实意味着当你尝试实例化任何的工具(即Car)时,你< em>必须提供实现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,因此{em>也类型为Workshop,因此宣布noWork1是合法的(和2)作为Workshop对象事件,尽管它们实际上是NoWork个对象。同样,请注意,由于Car延伸Vehicle,它会将car声明为Vehicle,即使它实际上是Car (但请记住Car a Vehicle)。

但是,为了澄清,你必须为每个扩展类提供两个Workshop类到Vehicle,你可以有类似的东西:< / p>

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

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

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

答案 1 :(得分:0)

如果您在教程link中看到桥梁模式图,他们假设有两种类型的工作班次

  1. 生产者
  2. 汇编
  3. 因此,他们使用了两个instacne of workshope接口,一个用于Producer,另一个用于Assemble。