哈喽伙计们,我们又相见啦~~ 假期过得愉快嘛??
小应学长在假期内的空余时间写了这篇文章,大家一起来学习吧
其实在现实生活中,有很多类可以有两个或多个维度的变化,如图形既可按形状分,又可按颜色分,如果用继承方式,m 种形状和 n 种颜色的图形就有 m*n 种,不但对应的子类很多,而且扩展比较困难。
比如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度
模式类型:结构设计模式
优点:
缺点:
桥接(Bridge)模式包含以下主要角色:
结构图:
实视化角色:
/**
* 实视化角色
*/
public interface Implemntor {
public void OperationImpl();
}
具体实现化角色:
/**
* 具体实现化角色
*/
public class ConcreteImplementorA implements Implemntor{
@Override
public void OperationImpl() {
System.out.println("具体实现化角色被访问");
}
}
抽象化角色:
/**
* 抽象化角色
*/
public abstract class Abstraction {
protected Implemntor implemntor;
protected Abstraction(Implemntor implemntor){
this.implemntor = implemntor;
}
public abstract void Operation();
}
扩展抽象化角色:
/**
* 扩展抽象化角色
*/
public class RefinedAbstraction extends Abstraction{
protected RefinedAbstraction(Implemntor implemntor) {
super(implemntor);
}
public void Operation(){
System.out.println("扩展抽象化角色被访问");
implemntor.OperationImpl();
}
}
测试类:
public class Test {
public static void main(String[] args) {
Implemntor implemntor = new ConcreteImplementorA();
Abstraction abs = new RefinedAbstraction(implemntor);
abs.Operation();
}
}
输出:
扩展抽象化角色被访问
具体实现化角色被访问
将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变
交通工具在路上行驶,这里有两个维度的变化,交通工具的类型不同,路也分水泥路和柏油路
交通工具类:
/**
* 交通工具类
*/
public interface Vehicle {
public void drive();
}
具体的交通工具:小汽车
/**
* 具体的交通工具:小汽车
*/
public class Car implements Vehicle{
@Override
public void drive() {
System.out.println("小汽车");
}
}
具体的交通工具:大巴车
/**
* 具体的交通工具:大巴车
*/
public class Bus implements Vehicle{
@Override
public void drive() {
System.out.println("大巴车");
}
}
抽象的路:
/**
* 抽象的路
*/
public abstract class Road {
protected Vehicle vehicle;
public Road(Vehicle vehicle){
this.vehicle = vehicle;
}
public abstract void driveOnRoad();
}
具体的路:油柏路
/**
* 具体的路:油柏路
*/
public class UnpavedRoad extends Road{
public UnpavedRoad(Vehicle vehicle) {
super(vehicle);
}
@Override
public void driveOnRoad() {
super.vehicle.drive();
System.out.println("行驶在油柏路");
}
}
具体的路:水泥路
/**
* 具体的路:水泥路
*/
public class CementRoad extends Road{
public CementRoad(Vehicle vehicle) {
super(vehicle);
}
@Override
public void driveOnRoad() {
super.vehicle.drive();
System.out.println("行驶在水泥路");
}
}
测试类:
//测试
public class Test {
public static void main(String[] args) {
Road roadCar = new CementRoad(new Car());
roadCar.driveOnRoad();
Road roadBus = new CementRoad(new Bus());
roadBus.driveOnRoad();
}
}
输出:
小汽车
行驶在水泥路
大巴车
行驶在水泥路
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用.