前言
文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。
本篇文章主要介绍桥接,这个模式个人认为其实是大家都在默默使用的模式(或者说间接性的使用?)
正文
一、定义
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。该模式用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系。
桥接模式中我们要明白名字中的桥接含义,会有那么座桥去连接两边进行相通,等到后面我的解释,大家可能会发现桥不一定连接两方可能n个地方;桥可能不存在,即桥和桥的某一边统一起来了,所以整体看上去是三部分构成,可能实际只有两部分,因为有一部分承担了两种角色。
二、情景假设
现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。本实例使用桥接模式来模拟毛笔的使用过程。
这边再解释一下,35=15以及3+5=8怎么来的。先讲一个小例子,假设我们要绘制一个图像,形状有矩形、圆形、椭圆和正方形四个形状类,而颜色中有红色、绿色和蓝色,那么现在如果想具体画一个图案出来,该怎么设计类结构,有三种情况:
第一种就是先实现了四个形状具体类,然后每个颜色都继承上面的类然后加上自己的颜色操作构成图形具体类,那么这里就有43=12种。
第二种有四个形状具体实现类,三个颜色具体实现类,然后定义双继承(当然java这里没有双继承,c++就有),也是12种
第三种就是用个“桥”去拼接形状和颜色,只有一座“桥”所以类的数量就看上面的4+3=7;
回归题目,相信大家应该明白为什么是8个类而不是15个。
三、情景分析
关于上面情景的类图(具体分析在下面)
类图第一眼看去虽乱,但是其实只要分成左右两部份,左边都是pen相关,右边都是color相关,这样看明白其实就差不多了,主要是怎么把桥两边的类给连接起来,而这里的连接其实是使用了关联的方式。
接下来代码:先搞定Color容易理解
//接口类Color
public interface Color
{
public void bepaint(String penType, String name);
}
//具体类
public class Red implements Color
{
public void bepaint(String penType, String name){
System.out.println(penType + "绿色的" + name);
}
}
...后面几个类大同小异就不展示了。
在这里我们定义了抽象Color类和颜色具体类,然后再定义
//抽象类Pen
public abstract Pen
{
protected Color color;
public void setColor(Color color){
this.color = color;
}
public abstract