桥梁模式
桥梁模式(Bridge Pattern)也称为桥接模式,是一种简单、不常用的设计模式。1桥梁模式的定义
桥梁模式的英文原话是:Decouple an abstraction from implementation so that the two can vary independently.意思是:将抽象和实现解耦,是两者可以独立的变化。桥梁模式有4个角色:- 抽象化(Abstraction) 角色:该角色抽象化的给出定义,并保存一个对现实化对象的引用。
- 实现化(Implementor)角色: 该角色给出实现化角色的接口,但不给出具体实现。
- 修正抽象化(RefinedAbstraction)角色:该角色扩展抽象化角色,它引用实现化角色并对抽象化角色进行修正。
- 具体实现化(ConcreteImplementor)角色:该角色对实现化角色接口中的方法进行具体实现。
桥梁模式类图创建实现化角色的接口Implementor.java
package com.eric.结构型模式.桥梁模式.引例;
/**
* @author Eric
* @ProjectName my_design_23
* @description 实现化角色
* @CreateTime 2020-12-01 14:01:45
*/
public interface Implementor {
//方法的实现化声明
public void operationImp();
}
创建具体实现化角色,并实现Implementor接口ConcreteImplementor.java
package com.eric.结构型模式.桥梁模式.引例;
/**
* @author Eric
* @ProjectName my_design_23
* @description 具体实现化角色
* @CreateTime 2020-12-01 14:04:28
*/
public class ConcreteImplementor implements Implementor {
//方法的具体实现
@Override
public void operationImp() {
System.out.println("处理业务中...");
}
}
创建抽象化角色
Abstraction.java
package com.eric.结构型模式.桥梁模式.引例;
/**
* @author Eric
* @ProjectName my_design_23
* @description 抽象化角色
* @CreateTime 2020-12-01 14:06:48
*/
public abstract class Abstraction {
//定义对现实化角色的引用
private Implementor implementor;
public Abstraction(Implementor implementor)
{
this.implementor = implementor;
}
//业务方法
public void operation(){
this.implementor.operationImp();
}
}
创建修正化角色RefinedAbstraction.javapackage com.eric.结构型模式.桥梁模式.引例;
/**
* @author Eric
* @ProjectName my_design_23
* @description 修正抽象化
* @CreateTime 2020-12-01 14:09:53
*/
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(Implementor implementor) {
super(implementor);
}
//修正父类的方法
@Override
public void operation() {
//修正抽象化的方法
super.operation();
}
}
测试类Client.javapackage com.eric.结构型模式.桥梁模式.引例;
/**
* @author Eric
* @ProjectName my_design_23
* @description 测试类
* @CreateTime 2020-12-01 14:10:58
*/
public class Client {
public static void main(String[] args) {
//定义一个实现化角色
ConcreteImplementor implementor = new ConcreteImplementor();
//定义一个抽象化角色
RefinedAbstraction refinedAbstraction = new RefinedAbstraction(implementor);
//执行
refinedAbstraction.operation();
}
}
测试结果2桥梁模式的应用
a.桥梁模式的优缺点桥梁模式作为一个使用率不高的模式,但是熟悉该模式对于理解面向对象的设计原则,包括开闭原则都很有帮助,有助于形成正确的设计思想和培养良好的设计风格。桥梁模式的优点有以下几方面- 抽象和实现分离是桥梁模式的主要特点,是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用绑定在一个固定的抽象层次上。
- 实现对客户透明,客户端不用关心细节的实现,他已经由抽象层通过聚合关系完成了封装。
- 提高了灵活性和扩展性。
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
- 设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
- 一个构件有多于一个的抽象化角色和实现化角色,系统需要他们之间进行动态耦合。
- 不希望或不适合使用继承的场合。继承具有强入侵性质,即父类有的方法,子类必须有;而桥梁模式是弱关联关系。因此对于比较明确不发生变化的,则可以通过继承完成;若不能确定是否会发生变化,则通过桥梁模式来解决。
- 猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态的选择。
- 墙上的开关,可以看到的开关是抽象的,不管里面具体怎么实现。
3桥梁模式实例
画画的类图创建颜色接口和图形抽象类Color.java
package com.eric.结构型模式.桥梁模式.例1.color;
/**
* @author Eric
* @ProjectName my_design_23
* @description 抽象颜色接口
* @CreateTime 2020-12-02 15:16:40
*/
public interface Color {
//获取颜色
String getColor();
}
AbstractShape.java
package com.eric.结构型模式.桥梁模式.例1.shape;
import com.eric.结构型模式.桥梁模式.例1.color.Color;
/**
* @author Eric
* @ProjectName my_design_23
* @description 抽象图形接口
* @CreateTime 2020-12-02 15:15:45
*/
public abstract class AbstractShape {
Color color;
public AbstractShape(Color color){
this.color = color;
}
public abstract void draw();
}
创建颜色的实现类Green.java
package com.eric.结构型模式.桥梁模式.例1.color;
/**
* @author Eric
* @ProjectName my_design_23
* @description 绿色
* @CreateTime 2020-12-02 16:19:35
*/
public class Green implements Color {
@Override
public String getColor() {
return "绿色";
}
}
Red.javapackage com.eric.结构型模式.桥梁模式.例1.color;
/**
* @author Eric
* @ProjectName my_design_23
* @description 红色
* @CreateTime 2020-12-02 16:18:51
*/
public class Red implements Color{
@Override
public String getColor() {
return "红色";
}
}
创建图像的抽象类Circle.javapackage com.eric.结构型模式.桥梁模式.例1.shape;
import com.eric.结构型模式.桥梁模式.例1.color.Color;
/**
* @author Eric
* @ProjectName my_design_23
* @description 圈圈
* @CreateTime 2020-12-02 15:57:16
*/
public class circle extends AbstractShape {
public circle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.println("使用"+color.getColor()+"画圈圈...");
}
}
Square.javapackage com.eric.结构型模式.桥梁模式.例1.shape;
import com.eric.结构型模式.桥梁模式.例1.color.Color;
/**
* @author Eric
* @ProjectName my_design_23
* @description 框框
* @CreateTime 2020-12-02 16:01:23
*/
public class Square extends AbstractShape {
public Square(Color color) {
super(color);
}
@Override
public void draw() {
System.out.println("使用"+color.getColor()+"画框框...");
}
}
创建测试类Test.javapackage com.eric.结构型模式.桥梁模式.例1;
import com.eric.结构型模式.桥梁模式.例1.color.Color;
import com.eric.结构型模式.桥梁模式.例1.color.Green;
import com.eric.结构型模式.桥梁模式.例1.shape.AbstractShape;
import com.eric.结构型模式.桥梁模式.例1.shape.Square;
/**
* @author Eric
* @ProjectName my_design_23
* @description 测试类
* @CreateTime 2020-12-02 17:35:08
*/
public class Test {
public static void main(String[] args) {
Color color = new Green();
AbstractShape shape = new Square(color);
shape.draw();
}
}
测试结果来自为知笔记(Wiz)