java设计模式-桥接模式
简单说一下(定义、举例)
什么是桥接设计模式:将抽象与实现分离,使他们可以独立化、他是用组合关系来代替继承
关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
简言之就是将抽象部分与实现部分分离,使它们都可以独立的变化。
举个栗子:我们去商店买包,包按照品牌分好多种,按照颜色又分好多种,存在多维度的变化。比如我们按用途分钱包和挎包,按颜色可分黄色和红色,两个维度来定义颜色类和包类。
颜色类(Color)是一个维度,定义为实现化角色,它有两个具体实现化角色:黄色和红色,通过 getColor() 方法可以选择颜色;包类(Bag)是另一个维度,定义为抽象化角色,它有两个扩展抽象化角色:挎包和钱包,它包含了颜色类对象,通过 getName() 方法可以选择相关颜色的挎包和钱包。最后用户可通过类获取包信息,并把选到的产品通过窗体现实出现。
稍微夸一下(优、缺点)
桥接设计模式的优点:
1.实现抽象和实现分离,扩展能力增强
2.实现细节对客户透明
桥接设计模式的缺点:
1.桥接模式的引入会增加系统的理解与设计难度,要求开发者针对抽象进行设计与编程。
顺便提一下(使用场景)
那么我们在什么时候或者情况下使用桥接设计模式呢?
1.一个类存在两个独立变化的维度,且这两个维度都需要进行扩展
2.不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,可选择桥接模式
3.系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建
立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系
详细讲一下(模式结构)
桥接模式包括以下组成部分:
1.抽象化角色:定义抽象类,并包含一个对实现化对象的引用。
2.扩展抽象化角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现
化角色中的业务方法。
3.实现化角色:定义实现化角色的接口,供扩展抽象化角色调用。
4.具体实现化角色:给出实现化角色接口的具体实现。
结构图如下(网上当的)
多多用一下(代码实现)
1.创建桥实现接口DrawAPI.java
public interface DrawAPI {
public void drawCircle(int radius,int x,int y);
}
2.创建实现了 DrawAPI 接口的实体桥接实现类RedCircle.java、GreenCircle.java
public class RedCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: red, radius: "
+ radius +", x: " +x+", "+ y +"]");
}
}
------------------------------------------------
public class GreenCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: green, radius: "
+ radius +", x: " +x+", "+ y +"]");
}
}
3.使用 DrawAPI 接口创建抽象类 Shape.java
public abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI){
this.drawAPI = drawAPI;
}
protected abstract void draw();
}
4.创建实现了 Shape 接口的实体类Circle.java
public class Circle extends Shape {
private int x,y,radius;
public Circle(int x,int y,int radius,DrawAPI drawAPI){
super(drawAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
@Override
protected void draw() {
drawAPI.drawCircle(radius,x,y);
}
}
5.使用 Shape 和 DrawAPI 类画出不同颜色的圆BridgePattern.java
public class BridgePattern {
public static void main(String[] args) {
Shape redCircle = new Circle(100,100,10,new RedCircle());
Shape greenCircle = new Circle(100,100,10,new GreenCircle());
redCircle.draw();
greenCircle.draw();
}
}