设计模式-桥接模式(Bridge)
一、桥接模式概述
1.1 什么是桥接模式
桥接模式,也被称为柄体(Handle and Body)模式或接口(Interface)模式,是一种桥接模式,也被称为柄体(Handle and Body)模式或接口(Interface)模式,是一种结构型设计模式。它的主要目的是将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种分离可以通过组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
举个例子,假设有一个几何形状Shape类,从它能扩展出两个子类:圆形Circle和方形Square。你希望对这样的类层次结构进行扩展以使其包含颜色,所以你打算创建名为红色Red和蓝色Blue的形状子类。但是,由于你已有两个子类,所以总共需要创建四个类才能覆盖所有组合,例如蓝色圆形BlueCircle和红色方形RedSquare。在层次结构中新增形状和颜色将导致代码复杂程度指数增长。在这种情况下,桥接模式就能起到作用,它将形状和颜色解耦,使得两者可以相对独立地变化。
1.2 简单实现桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,使它们可以独立地变化。下面是一个简单的 Java 实现:
首先,我们创建一个抽象类 Shape,它有一个抽象方法 draw():
publicabstractclassShape{publicabstractvoiddraw();}
然后,我们创建两个实现了 Shape 接口的具体类:Circle 和 Square:
publicclassCircleextendsShape{@Overridepublicvoiddraw(){System.out.println("画一个圆形");}}publicclassSquareextendsShape{@Overridepublicvoiddraw(){System.out.println("画一个正方形");}}
接下来,我们创建一个桥接类 Color,它也实现了 Shape 接口,并持有一个 Shape 类型的引用:
publicclassColorextendsShape{privateShape shape;publicColor(Shape shape){this.shape = shape;}@Overridepublicvoiddraw(){setColor();
shape.draw();resetColor();}privatevoidsetColor(){System.out.println("设置颜色");}privatevoidresetColor(){System.out.println("重置颜色");}}
最后,我们在主函数中测试这个桥接模式:
publicclassMain{publicstaticvoidmain(String[] args){Shape circle =newCircle();Shape square =newSquare();Shape coloredCircle =newColor(circle);Shape coloredSquare =newColor(square);
coloredCircle.draw();
coloredSquare.draw();}}
运行结果:
设置颜色
画一个圆形
重置颜色
设置颜色
画一个正方形
重置颜色
二、使用桥接模式注意事项
使用桥接模式时需要注意以下几点:
- 1、抽象部分和实现部分应该分离,不应该有过多的耦合。
- 2、桥接模式适用于多个维度的变化,如果只有一两个维度的变化,使用继承会更加简单。
- 3、桥接模式会增加系统的复杂度,需要谨慎使用。
- 4、桥接模式要求正确选择和使用抽象类和接口,避免过度抽象或过于具体化。
- 5、桥接模式的实现需要考虑对象的创建和管理,需要合理设计对象之间的关系和依赖关系。
三、实现桥接模式的方式
3.1 使用继承和组合的方式实现桥接模式
这种方式需要创建两个类,一个作为抽象类,另一个作为具体类。抽象类中定义了对抽象部分和实现部分的引用,具体类中实现了抽象部分的具体逻辑。
// 抽象部分abstractclassAbstraction{protectedImplementation implementation;publicvoidsetImplementation(Implementation implementation){this.implementation = implementation;}publicabstractvoidoperation();}// 具体部分classConcreteAbstractionextendsAbstraction{@Overridepublicvoidoperation(){System.out.println("具体操作");}}// 实现部分interfaceImplementation{voidoperationImpl();}classConcreteImplementationAimplementsImplementation{@OverridepublicvoidoperationImpl(){System.out.println("实现A的操作");}}classConcreteImplementationBimplementsImplementation{@OverridepublicvoidoperationImpl(){System.out.println("实现B的操作");}}// 客户端代码publicclassClient{publicstaticvoidmain(String[] args){Abstraction abstraction =newConcreteAbstraction();Implementation implementationA =newConcreteImplementationA();Implementation implementationB =newConcreteImplementationB();
abstraction.setImplementation(implementationA);
abstraction.operation();// 输出:具体操作
abstraction.setImplementation(implementationB);
abstraction.operation();// 输出:具体操作}}
3.2 使用接口和内部类的方式实现桥接模式
这种方式需要创建一个接口,一个抽象类和一个内部类。抽象类中定义了对接口的引用,内部类中实现了抽象类的具体逻辑。
// 接口interfaceShape{voiddraw();}// 抽象部分abstractclassAbstractShape{protectedShape shape;publicvoidsetShape(Shape shape){this.shape = shape;}publicabstractvoiddraw();}// 具体部分classRectangleextendsAbstractShape{@Overridepublicvoiddraw(){
shape.draw();}}classCircleextendsAbstractShape{@Overridepublicvoiddraw(){
shape.draw();}}// 内部类实现接口classShapeImplimplementsShape{@Overridepublicvoiddraw(){System.out.println("绘制形状");}}// 客户端代码publicclassClient{publicstaticvoidmain(String[] args){AbstractShape abstractShape =newRectangle();Shape shapeA =newShapeImpl();Shape shapeB =newShapeImpl();
abstractShape.setShape(shapeA);
abstractShape.draw();// 输出:绘制形状
abstractShape.setShape(shapeB);
abstractShape.draw();// 输出:绘制形状}}
版权归原作者 一碗油泼面 所有, 如有侵权,请联系我们删除。