桥接模式

       桥接模式(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/

  

posted on 2022-04-05 08:22  溪水静幽  阅读(98)  评论(0)    收藏  举报