桥接模式的适用环境:
- 1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。
示例:
- 交通工具:car、bus、bike是一类,共同点是可以行驶即run;
- 道路:城市道路、乡村道路、山路等是一类;
- 用road抽象类(桥接类),维护行为的实现
创建RunApi及car、bus、bike的实现
package com.design.demo.bridge; /** * @author: GuanBin * @date: Created in 下午10:18 2019/8/23 */ public interface RunApi { /** * @param speed 速度 km/h * @param hour 时间 h */ public void run(int speed, int hour); }
package com.design.demo.bridge; /** * @author: GuanBin * @date: Created in 下午10:24 2019/8/23 */ public class CarRun implements RunApi { @Override public void run(int speed, int hour) { System.out.println("The car ran " + speed * hour + " kilometers at a speed of " + speed + " km/h per hour."); } }
package com.design.demo.bridge; /** * @author: GuanBin * @date: Created in 下午10:24 2019/8/23 */ public class BusRun implements RunApi { @Override public void run(int speed, int hour) { System.out.println("The bus ran " + speed * hour + " kilometers at a speed of " + speed + " km/h per hour."); } }
package com.design.demo.bridge; /** * @author: GuanBin * @date: Created in 下午10:24 2019/8/23 */ public class BikeRun implements RunApi { @Override public void run(int speed,int hour) { System.out.println("The bike ran " + speed * hour + " kilometers at a speed of " + speed + " km/h per hour."); } }
桥接类Road 及UnbanRoad
package com.design.demo.bridge; /** * @author: GuanBin * @date: Created in 下午10:30 2019/8/23 */ public abstract class Road { protected RunApi runApi; public Road(RunApi runApi) { this.runApi = runApi; } public abstract void runDistance(); }
package com.design.demo.bridge; /** * @author: GuanBin * @date: Created in 下午10:34 2019/8/23 */ public class UrbanRoad extends Road { private int speed; private int hour; public UrbanRoad(RunApi runApi, int speed, int hour) { super(runApi); this.speed = speed; this.hour = hour; } @Override public void runDistance() { runApi.run(speed, hour); } }
Client类
package com.design.demo.bridge; /** * @author: GuanBin * @date: Created in 下午10:40 2019/8/23 */ public class Client { public static void main(String[] args) { UrbanRoad carRunUrbanRD = new UrbanRoad(new CarRun(), 90,2); UrbanRoad busRunUrbanRD = new UrbanRoad(new BusRun(), 60,2); UrbanRoad bikeRunUrbanRD = new UrbanRoad(new BikeRun(), 10,2); carRunUrbanRD.runDistance(); busRunUrbanRD.runDistance(); bikeRunUrbanRD.runDistance(); } }
输出:
The car ran 180 kilometers at a speed of 90 km/h per hour. The bus ran 120 kilometers at a speed of 60 km/h per hour. The bike ran 20 kilometers at a speed of 10 km/h per hour.
总结:
1.桥接模式的优点
(1)实现了抽象和实现部分的分离
桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
(2)更好的可扩展性
由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性。
(3)可动态的切换实现
由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。
(4)实现细节对客户端透明,可以对用户隐藏实现细节。
2.桥接模式的缺点
(1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。