桥接模式
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。即实现系统可从多种维度分类,桥接模式将各维度抽象出来,各维度独立变化,之后可通过聚合,将各维度组合起来,减少了各维度间的耦合。
不必要的继承导致类爆炸
汽车可按品牌分(BMT,BenZ,Land Rover),也可按手动档、自动档、手自一体来分。如果对于每一种车都实现一个具体类。对于每种组合都需要创建一个具体类,如果有N个维度,每个维度有M种变化,则需要MNMN个具体类,类非常多,并且非常多的重复功能。

桥接模式类图

当把每个维度拆分开来,只需要M*N个类,并且由于每个维度独立变化,不会出现重复代码。如果增加手自一体档,只需要增加一个AMT类即可
AbstractCar
public abstract class AbstractCar { protected Transmission gear; public abstract void run(); public void setGear(Transmission gear) { this.gear = gear; } }
Tranmission
public interface Transmission { /** * 操作 */ void operate(); }
Auto:自动挡
@Slf4j public class Auto implements Transmission { @Override public void operate() { log.info("auto is operating"); } }
Manual:手动挡
@Slf4j public class Manual implements Transmission { @Override public void operate() { log.info("manual operating"); } }
BMWCar
@Slf4j public class BMWCar extends AbstractCar { @Override public void run() { gear.operate(); log.info("BMWCar is running"); } }
LoadRoverCar
@Slf4j public class LoadRoverCar extends AbstractCar { @Override public void run() { gear.operate(); log.info("loadRoverCar is running"); } }
测试
public class BridgeTest { public static void main(String[] args) { Transmission auto = new Auto(); BMWCar bmwCar = new BMWCar(); bmwCar.setGear(auto); bmwCar.run(); Transmission manual = new Manual(); LoadRoverCar loadRoverCar = new LoadRoverCar(); loadRoverCar.setGear(manual); loadRoverCar.run(); } }
参考:
http://www.jasongj.com/design_pattern/bridge/
立志如山 静心求实
浙公网安备 33010602011771号