本篇文章给大家带来了关于java的相关知识,其中主要介绍了桥接模式的相关问题,桥接模式将抽象与实现分离,使它们可以独立变化,降低了抽象和实现这两个可变维度的耦合度,下面一起来看一下,希望对大家有帮助。
推荐学习:《java视频教程》
其实在现实生活中,有很多类可以有两个或多个维度的变化,如图形既可按形状分,又可按颜色分,如果用继承方式,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(); }}
输出:
小汽车 行驶在水泥路 大巴车 行驶在水泥路
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用.
推荐学习:《java视频教程》
以上是详细介绍Java桥接模式的详细内容。更多信息请关注PHP中文网其他相关文章!