桥接模式
一、前言
桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。
二、桥接模式的用意
桥梁模式虽然不是一个使用频率很高的模式,但是熟悉这个模式对于理解面向对象的设计原则,包括“开-闭”原则以及组合/聚合复用原则都很有帮助。理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格。
桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。这句话很短,但是第一次读到这句话的人很可能都会思考良久而不解其意。
三、桥梁模式的UML图
四、代码示例
1、手机的品牌:Brand
package com.gykalc.jdk8.bridge;
public interface Brand {
/**
* 不同品牌的手机也有开机功能
*/
void open();
/**
* 不同品牌的手机也有关机功能
*/
void close();
/**
* 不同品牌的手机也有显示功能
*/
void show();
}
2、抽象手机类:Phone
package com.gykalc.jdk8.bridge;
public abstract class Phone {
// 手机可以有不同的品牌
private Brand brand;
public Brand getBrand() {
return brand;
}
public void setBrand(Brand brand) {
this.brand = brand;
}
public Phone(Brand brand) {
this.brand = brand;
}
/**
* 开机
*/
public abstract void open();
/**
* 关机
*/
public abstract void close();
/**
* 显示画面
*/
public abstract void show();
}
3、品牌实现类:XiaoMi和HuaWei
package com.gykalc.jdk8.bridge;
public class XiaoMi implements Brand {
@Override
public void open() {
System.out.println("小米手机开机...");
}
@Override
public void close() {
System.out.println("小米手机关机...");
}
@Override
public void show() {
System.out.println("小米手机显示画面...");
}
}
class HuaWei implements Brand {
@Override
public void open() {
System.out.println("华为手机开机...");
}
@Override
public void close() {
System.out.println("华为手机关机...");
}
@Override
public void show() {
System.out.println("华为手机显示画面...");
}
}
4、具体手机类:翻盖手机和智能手机——》(FlipPhone和SmartPhone)
package com.gykalc.jdk8.bridge;
/**
* 翻盖手机
*/
public class FlipPhone extends Phone {
public FlipPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
this.getBrand().open();
System.out.println("翻盖手机开机...");
}
@Override
public void close() {
this.getBrand().close();
System.out.println("翻盖手机关机...");
}
@Override
public void show() {
this.getBrand().show();
System.out.println("翻盖手机显示画面...");
}
}
/**
* 智能手机
*/
class SmartPhone extends Phone{
public SmartPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
this.getBrand().open();
System.out.println("智能手机开机...");
}
@Override
public void close() {
this.getBrand().close();
System.out.println("智能手机关机...");
}
@Override
public void show() {
this.getBrand().show();
System.out.println("智能手机显示画面...");
}
}
5、测试调用类:Client
package com.gykalc.jdk8.bridge;
public class Client {
public static void main(String[] args) {
FlipPhone flipPhone = new FlipPhone(new XiaoMi());
flipPhone.open();
flipPhone.close();
flipPhone.show();
System.out.println("----------------------------------");
FlipPhone flipPhone1 = new FlipPhone(new HuaWei());
flipPhone1.open();
flipPhone1.close();
flipPhone1.show();
System.out.println("------------------------------------");
SmartPhone smartPhone = new SmartPhone(new HuaWei());
smartPhone.open();
smartPhone.close();
smartPhone.open();
System.out.println("----------------------------------------");
SmartPhone smartPhone1 = new SmartPhone(new XiaoMi());
smartPhone1.open();
smartPhone1.close();
smartPhone1.show();
}
}
五、总结
-
分离抽象和实现部分
桥梁模式分离了抽象部分和实现部分,从而极大地提供了系统的灵活性。让抽象部分和实现部分独立出来,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。 -
更好的扩展性
桥梁模式使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大大提高了系统的可扩展性。