桥接模式的基本概念
桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
什么时候用桥接模式
桥接模式主要用于类继承关系的解耦上,也可用于隐藏抽象的具体细节上,当类具有多个可变元素时,我们不应将其依赖于具体的实现,而是将其依赖于抽象。
又如模板方法模式般,将不变的不变,可变的封装。
比方说我们需要一支画笔,能画出不同的形状、颜色或是更多属性,若是通过类继承来完成,类的数量也将成几何倍数的增加,而桥接模式正是把他的抽象与实现分离,只向客户端展示所关心的部分,而把其余部分抽象,通过注入持有的方式让他们结合使用。
桥接模式怎么用
在实现画笔的功能中,我选择将颜色作为实现展示给客户端,
将形状作为一个接口抽象:
/**
* @author : cjd
* @Description : 形状实现接口 实现具体的功能
* @create : 2018-03-02 11:32
**/
public interface DrawShape {
void draw();
}
以及形状的具体实现:
/**
* @author : cjd
* @Description : 圆形
* @create : 2018-03-02 11:36
**/
public class DrawCircular implements DrawShape {
@Override
public void draw() {
System.out.println("我是圆形");
}
}
颜色作为一个桥接类,他需要持有形状并调用形状的方法:
/**
* @author : cjd
* @Description : 桥接类
* @create : 2018-03-02 11:33
**/
public abstract class Color {
//桥接类需持有实现类的接口
private DrawShape drawShape;
//实现类注入与获取
public DrawShape getDrawShape() {
return drawShape;
}
public void setDrawShape(DrawShape drawShape) {
this.drawShape = drawShape;
}
//交给子类实现
public abstract void draw();
}
我们需要一种红色的画笔继承颜色:
/**
* @author : cjd
* @Description :
* @create : 2018-03-02 11:41
**/
public class Red extends Color {
@Override
public void draw() {
System.out.println("我是红色");
super.getDrawShape().draw();
}
}
主函数这样进行调用:
/**
* @author : cjd
* @Description : 主函数
* @create : 2018-03-01 13:43
**/
public class Main {
public static void main(String[] args) {
Color drawRed = new Red();
drawRed.setDrawShape(new DrawCircular());
drawRed.draw();
}
}
这样使用的好处在,当我们需要一个新的颜色或者新的形状时,都只需要在原有上增加一个类即可,又或者以后需要增加大小的新判定等等….极大的维护了代码的易扩展性。
后记
学习设计模式的过程中,自我感觉对设计模式的思想是在一点点的吸收的,但是却对很多设计模式之间的区别又产生了很多的疑问,可能我对某种设计模式的理解也会出很多错,可每一种设计模式都让我对整体的设计模式更深的增加了理解。
设计模式很多都是基于抽象的,这些抽象也使代码更加规划整洁易于理解,善用抽象与接口而不滥用,哪怕不懂设计模式,也是在用设计模式。