桥梁模式也称桥接模式,是一种简单但不常使用的设计模式。
习大和蔡二两人去拉面馆,习大点了一份牛肉拉面,蔡二点了一份牛肉刀削面。面上来后,习大喜欢吃辣椒就添加了一些辣椒调料,蔡二喜欢吃醋就添加了一些醋调料。
上面场景中,面馆把面和调料品分开,让面和调味品独立出来,用用户决定,类似于设计中的桥梁模式。
将抽象和实现解耦,使得两者可以独立地变化。
比如现实场景中吃的面就是抽象化角色,保持的实现对象引用就是配料接口对象。
实现面接口后可以创建刀削面、拉面、油泼面等等
这里虽然定义的是实现化角色,其实不是对抽象化角色的实现,而是被抽象化持有的一个接口对象
这里就相当于现实场景中的配料接口对象。实现这个接口可以得到各种调料:柴米油盐酱醋茶等等
这里上是实现了上面第二个的实现化角色。
就相当于现实场景中的具体的调料角色,比如辣椒和醋。
这个就是现实场景中的各种主食面
它里面包含了调料接口,创建的时候用调料接口的具体实现类,就相当于持有具体的调料对象了。
桥梁模式虽然四一种使用率不高的模式,但是熟悉该模式对于读者理解面向对象的设计原则,包括开闭原则都很有帮助,有助于设计者形成正确的设计思想和良好的设计风格。
优点
桥梁模式为力解决继承的缺点而提出的设计模式。在该设计模式下,实现可以不受抽象的约束,不用绑定在一个固定的抽象层次上。
客户不关心实现的细节,它已经由抽象层通过聚合关系完成了封装。
继承具有强入侵性质,即父类有的方法,子类必须有;而桥梁模式是弱关联关系。因此,对于明确不发生变化的,则可以通过继承完成;若不能确定是否发生变化,则通过桥梁模式来解决。
这里以上面的吃面的现实的现实例子设计代码示例。
package p10_bridge; /** * 调味品,佐料接口 */ public interface ISeasoning { //添加调味品、佐料 String addSeasoning(); }
package p10_bridge; /** * 面条,抽象类 */ public abstract class Noodle { //持有调料接口对象 ISeasoning seasoning; //构造方法,传入调料对象 public Noodle(ISeasoning seasoning){//这里传入的调料接口对象,实际是子类的实例化对象,也就是具体的调料对象 this.seasoning=seasoning; } //获得面条 public abstract String getNoodle(); }
package p10_bridge; /** * 辣椒类 */ public class Pepper implements ISeasoning{ @Override public String addSeasoning() { return "添加调料:辣椒"; } }
package p10_bridge; /** * 调料醋的类 */ public class Vinegar implements ISeasoning{ @Override public String addSeasoning() { return "添加调料:酸醋"; } }
package p10_bridge; /** * 牛肉拉面对象类 */ public class RamenNodes extends Noodle { //构造方法,传入调料接口对象 public RamenNodes(ISeasoning seasoning) {//ISeasoning在父类已经定义了 super(seasoning); } //获取完整的面条内容 @Override public String getNoodle() { return seasoning.addSeasoning() + "的牛肉拉面"; } }
package p10_bridge; /** * 牛肉刀削面 * 这里调料是什么要看调料接口的实例化对象是什么 */ public class SliceNoodles extends Noodle { //构造方法,传入调料接口对象 public SliceNoodles(ISeasoning seasoning) {//ISeasoning在父类已经定义了 super(seasoning); } //获取完整的面条内容 @Override public String getNoodle() { return seasoning.addSeasoning() + "的牛肉刀削面"; } }
package p10_bridge; /** * 桥梁模式的测试类 * 吃面条:习大和蔡二两人去拉面馆,习大点了一份牛肉拉面,蔡二点了一份牛肉刀削面。 * 面上来后,习大喜欢吃辣椒就添加了一些辣椒调料,蔡二喜欢吃醋就添加了一些醋调料。 */ public class BridgeDemo { public static void main(String[] arg) { //创建调料对象,多态用法,父类的对象子类的实例化 ISeasoning pepper = new Pepper();//辣椒 ISeasoning vinegar = new Vinegar();//醋 //面条对象,可以多态,也可以不用 Noodle ramenNoodle = new RamenNodes(pepper);//拉面加辣椒,如果不用多态:RamenNodes ramenNoodle=new RamenNodes(pepper); Noodle sliceNoodles = new SliceNoodles(pepper);//刀削面加醋 //最终面条成品 System.out.println("习大吃的是--->" + ramenNoodle.getNoodle()); System.out.println("蔡二吃的是--->" + sliceNoodles.getNoodle()); } }
桥梁模式就为大家介绍到这里。