参考程杰《大话设计模式》
桥接模式
将抽象部分与它的实现部分分离,使他们都可以独立地变化。
什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,实现是指抽象类和他的派生类用来实现自己的对象。
比如手机有很多品牌的手机,而手机同时又有很多软件功能,每种品牌手机都会有这些软件功能,那么设计时应采用桥接模式,即手机品牌是一个抽象类,手机软件功能是一个抽象类,具体的品牌和软件功能均继承自两个类,而两个类之前关系是聚合关系。
合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。
实例
手机软件抽象类和子类,是属于手机品牌一部分的
public abstract class Software {
public abstract void RunApp();
}
public class GameSoftware extends Software{
@Override
public void RunApp() {
System.out.println("运行游戏软件");
}
}
public class PhotoSoftware extends Software{
@Override
public void RunApp() {
System.out.println("运行拍照软件");
}
}
手机品牌抽象类及其子类,其成员变量包括手机软件,即聚合关系——“桥”
public abstract class Brand {
protected String name;
protected Software software;
public void setSoftware(Software software){
this.software = software;
}
public abstract void Run();
public Brand(String name) {
this.name = name;
}
}
public class BrandA extends Brand{
public BrandA(String name) {
super(name);
}
@Override
public void Run() {
System.out.println(this.name);
this.software.RunApp();
}
}
public class BrandB extends Brand{
public BrandB(String name) {
super(name);
}
@Override
public void Run() {
System.out.println(this.name);
this.software.RunApp();
}
}
主方法调用
public class TestdemoApplication {
public static void main(String[] args) {
Brand brand = new BrandA("手机品牌A");
brand.setSoftware(new GameSoftware());
brand.Run();
Brand brand1 = new BrandB("手机品牌B");
brand1.setSoftware(new PhotoSoftware());
brand1.Run();
}
}
运行结果如下: