桥接模式-bridge

2018-04-19  本文已影响0人  HeJD

将抽象部分与它的实现部分分离,使他们都可以独立地变化

这里写图片描述

效果及实现要点:

1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同路上的不同汽车。
3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

适用性:

在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

总结:Bridge模式是一个非常有用的模式,也非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则。

代码

Main

public class Main {

    public static void main(String[] args) {
        Road hroad=new hightWay();
        Road croad=new contryRoad();
        
        Car c1=new BMW();
        Car c2=new Audi();
        
        hroad.setCar(c1);
        hroad.run();
        
        croad.setCar(c2);
        croad.run();
        
        People man=new Man();
        man.setRoad(hroad);
        man.run();
    }

}

abs:Car

public abstract class Car {
    public abstract void run();
}

abs:People

public abstract class People {

    protected Road road=null;
    public abstract void run();
    public abstract void setRoad(Road road);
}

abs:Road

public abstract class Road {
    protected Car car;
    public abstract void run();
    public abstract void setCar(Car car);
}

imp:Audi

public class Audi extends Car {

    @Override
    public void run() {
        System.out.println("Audi run");
    }

}

imp:BMW

public class BMW extends Car {

    @Override
    public void run() {
        System.out.println("BMW run");
    }

}

imp:contryRoad

public class contryRoad extends Road {

    @Override
    public void run() {
        System.out.println("contry road");
        car.run();
    }
    
    public void setCar(Car car){
        this.car=car;
    }

}

imp:hightWay

public class hightWay extends Road {

    @Override
    public void run() {
        System.out.println("hight way");
        this.car.run();
    }
    
    public void setCar(Car car){
        this.car=car;
    }

}

imp:Man

public class Man extends People {

    @Override
    public void run() {
        System.out.println("man run");
        super.road.run();
    }
    public void setRoad(Road road){
        super.road=road;
    }

}
上一篇 下一篇

猜你喜欢

热点阅读