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

〇、小故事

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

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

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

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

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

再比如:我们想做一个支持多品牌电视的遥控器 ,那么此时,我创建了一个遥控器的父类,叫RemoteController,然后我们接入了两个品牌(RCASony)的电视遥控器接入合约,我们针对这两个品牌,分别做了RCARemoteControllerSonyRemoteController。看似一切进展顺利,那么随着我们口碑的建立,越来越多的电视厂商,邀请我们做他们公司的遥控器。我们随后又接入了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^)/ ~ 「干货分享,每天更新」

相关推荐
孪生质数-8 分钟前
SQL server 2022和SSMS的使用案例1
网络·数据库·后端·科技·架构
uhakadotcom12 分钟前
AWS Lightsail 简介与实践
后端·面试·github
程序员鱼皮1 小时前
2025最新 Java 面经:美团后端面试真实复盘,附答案模板,速速收藏!
java·后端·面试
有来技术2 小时前
从0到1手撸企业级权限系统:基于 youlai-boot(开源) + Java17 + Spring Boot 3 完整实战
java·spring boot·后端
陈明勇2 小时前
一文掌握 MCP 上下文协议:从理论到实践
人工智能·后端·mcp
SimonKing2 小时前
因为不知道条件注解@Conditional,错失15K的Offer!
java·后端·架构
橘猫云计算机设计2 小时前
基于springboot微信小程序的旅游攻略系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·微信小程序·毕业设计·旅游
雷渊2 小时前
spring-IoC容器启动流程源码分析
java·后端·面试
用户3315489111072 小时前
一招搞定Java线程池炸弹,系统吞吐量暴增10倍!
java·后端