Java设计模式之桥模式(Bridge模式)介绍
Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合。
为什么使用桥模式
通常,当一个抽象类或接口有多个具体实现(concretesubclass),这些concrete之间关系可能有以下两种:
1.这多个具体实现之间恰好是并列的,如前面举例,打桩,有两个concreteclass:方形桩和圆形桩;这两个形状上的桩是并列的,没有概念上的重复,那么我们只要使用继承就可以了。
2.实际应用上,常常有可能在这多个concreteclass之间有概念上重叠。那么需要我们把抽象共同部分和行为共同部分各自独立开来,原来是准备放在一个接口里,现在需要设计两个接口,分别放置抽象和行为。
例如,一杯咖啡为例,有中杯和大杯之分,同时还有加奶不加奶之分。如果用单纯的继承,这四个具体实现(中杯大杯加奶不加奶)之间有概念重叠,因为有中杯加奶,也有中杯不加奶,如果再在中杯这一层再实现两个继承,很显然混乱,扩展性极差。那我们使用Bridge模式来实现它。
如何实现桥模式
以上面提到的咖啡为例。我们原来打算只设计一个接口(抽象类),使用Bridge模式后,我们需要将抽象和行为分开,加奶和不加奶属于行为,我们将它们抽象成一个专门的行为接口。
先看看抽象部分的接口代码:
publicabstractclassCoffee{ CoffeeImpcoffeeImp; publicvoidsetCoffeeImp(){ this.CoffeeImp=CoffeeImpSingleton.getTheCoffeImp(); } publicCoffeeImpgetCoffeeImp(){returnthis.CoffeeImp;} publicabstractvoidpourCoffee(); }
其中CoffeeImp是加不加奶的行为接口,看其代码如下:
publicabstractclassCoffeeImp{ publicabstractvoidpourCoffeeImp(); }
现在我们有了两个抽象类,下面我们分别对其进行继承,实现concreteclass:
//中杯 publicclassMediumCoffeeextendsCoffee{ publicMediumCoffee(){setCoffeeImp();} publicvoidpourCoffee(){ CoffeeImpcoffeeImp=this.getCoffeeImp(); //我们以重复次数来说明是冲中杯还是大杯,重复2次是中杯 for(inti=0;i<2;i++){ coffeeImp.pourCoffeeImp(); } } }
//大杯
publicclassSuperSizeCoffeeextendsCoffee{ publicSuperSizeCoffee(){setCoffeeImp();} publicvoidpourCoffee(){ CoffeeImpcoffeeImp=this.getCoffeeImp(); //我们以重复次数来说明是冲中杯还是大杯,重复5次是大杯 for(inti=0;i<5;i++){ coffeeImp.pourCoffeeImp(); } } }