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

〇、小故事

小王最近对画油画非常的感兴趣 ,尤其是当他参观完毕加索画展之后,更觉得自己有画画天赋了,"这画我自己也能画啊!这以后一幅画随随便便买它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^)/ ~ 「干货分享,每天更新」

相关推荐
假装我不帅1 小时前
asp.net framework从webform开始创建mvc项目
后端·asp.net·mvc
神仙别闹1 小时前
基于ASP.NET+SQL Server实现简单小说网站(包括PC版本和移动版本)
后端·asp.net
计算机-秋大田2 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
货拉拉技术2 小时前
货拉拉-实时对账系统(算盘平台)
后端
掘金酱3 小时前
✍【瓜分额外奖金】11月金石计划附加挑战赛-活动命题发布
人工智能·后端
代码之光_19803 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi3 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
颜淡慕潇4 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
尘浮生5 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea