趣解设计模式之《当代毕加索小王》

〇、小故事

小王最近对画油画非常的感兴趣 ,尤其是当他参观完毕加索画展之后,更觉得自己有画画天赋了,"这画我自己也能画啊!这以后一幅画随随便便买它2、3个亿,这不发财了!"于是,他就开始着手购买画油画的工具了。

假设画某种线条,有三种笔,分别为:粗毛笔 、中毛笔 和细毛笔 ;同时也有两种颜色,分别为:红墨水 和蓝墨水 ;所以,总共我们可以画出6种样式的线条。最容易想到的实现就是我们要创建这6种线条类型的对象实例。如下图所示:

但是,如果这样设计,以后如果再有其他颜色的墨水,那么类会越来越多,所以,我们想到把毛笔抽象一层,如下图所示:

那既然毛笔已经抽象出一层了,墨水当然也可以抽象出一层,那么最终的结构如下图所示:

这样,我们有了两个大类 ,分别为:毛笔类 和墨水类,以后无论添加什么样式的毛笔或者添加什么颜色的墨水,就可以创造出各式各样的线条了。

再比如:我们想做一个支持多品牌电视的遥控器 ,那么此时,我创建了一个遥控器的父类,叫RemoteController,然后我们接入了两个品牌(RCA和Sony)的电视遥控器接入合约,我们针对这两个品牌,分别做了RCARemoteController和SonyRemoteController。看似一切进展顺利,那么随着我们口碑的建立,越来越多的电视厂商,邀请我们做他们公司的遥控器。我们随后又接入了10家公司。那么我们现在就有12种遥控器了。

随着商品屏幕化的进程,大屏手机,带屏幕的电饭煲、电风扇、空调等等。我们的遥控器也要加入带屏幕的版本 。那么针对这个请求,我们就需要为已有的12种厂商遥控器都加入带屏幕的版本,那么总的RemoteController子类就突增为24种了...... 我们的子类实现噩梦还远远没有结束。

为了解决以上问题,我们就来引出今天的设计模式------桥接模式。

一、模式定义

桥接模式 (Bridge Pattern)

将抽象部分和实现部分,分离解耦,使得两者可以独立地变化。

桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立变化。

桥接模式的优点

【1 】将实现予以解耦,让它和应用之间不再永久绑定。

【2 】抽象和实现可以独立扩展,不会影响到对方。

【3】对于"具体的抽象类"所做的改变,不会影响到客户。

二、模式类图

根据以上毛笔的例子,我们来绘制一下模式的类图。在这里我们来抽象出变化和不变的部分。首先,不变的是需要毛笔 和颜料 这两大类。变化的是,需要针对不同毛笔粗细和颜料的颜色具有不同的具体的实现 。那么,通过将毛笔和燃料进行Has-A的聚合,来实现桥接。具体如下所示:

三、代码实现

抽象画笔类 :BrushPenAbstraction.java

java 复制代码
@Data
public abstract class BrushPenAbstraction {
    // 颜色接口
    protected ColorImplementor color;

    // 绘画操作
    public abstract void draw();
}

粗毛笔实现类 :BigBurshPen.java

java 复制代码
public class BigBurshPen extends BrushPenAbstraction {
    @Override
    public void draw() {
        System.out.println("Big and " + color.getColor() + " drawing!");
    }
}

中毛笔实现类 :MiddleBurshPen.java

java 复制代码
public class MiddleBurshPen extends BrushPenAbstraction {
    @Override
    public void draw() {
        System.out.println("Middle and " + color.getColor() + " drawing!");
    }
}

细毛笔实现类 :SmallBurshPen.java

java 复制代码
public class SmallBurshPen extends BrushPenAbstraction {
    @Override
    public void draw() {
        System.out.println("Small and " + color.getColor() + " drawing!");
    }
}

颜色大类 :ColorImplementor.java

java 复制代码
public interface ColorImplementor {
    String getColor();
}

红色墨水类 :RedColor.java

java 复制代码
public class RedColor implements ColorImplementor {
    @Override
    public String getColor() {
        return "Red";
    }
}

蓝色墨水 :BlueColor.java

java 复制代码
public class BlueColor implements ColorImplementor {
    @Override
    public String getColor() {
        return "Blue";
    }
}

桥梁模式测试类 :BridgeTest.java

java 复制代码
public class BridgeTest {
    public static void main(String[] args) {
        BrushPenAbstraction brushPen = new BigBurshPen();
        brushPen.setColor(new RedColor());
        brushPen.draw();

        brushPen.setColor(new BlueColor());
        brushPen.draw();

        brushPen = new SmallBurshPen();
        brushPen.setColor(new BlueColor());
        brushPen.draw();
    }
}

运行结果:

java 复制代码
Big and Red drawing!
Big and Blue drawing!
Small and Blue drawing!

Process finished with exit code 0

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号"爪哇缪斯" ~ \(^o^)/ ~ 「干货分享,每天更新」

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
大勇前进3 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu3 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile3 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白803 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙3 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端
盖伦发发3 天前
软件工程SOLID 五大设计原则
后端·软件工程