设计模式总结篇系列:桥接模式(Bridge)

在实际类设计过程中,有时会遇到此类情况:由于实际的需要,某个类具有两个或两个以上的维度变化,如果利用继承将每种可能的变化情况都定义成一个类,一是会导致类膨胀的问题,二是以后不太好维护和并且违背类的设计原则。那么面对这种情况,类改如何设计呢?这就是本文所要讲到的桥接模式。

简单的讲,桥接模式是指:将抽象和行为划分开来,从而将各个可能变化的维度分离开来,各自独立成一个类,但是能够动态的组合。

貌似有点抽象,下面通过一个简单的例子来理解桥接模式。

我们可以通过Email发送信息,也可以手段短信发送信息(当然,以后很可能新增电报发信息等等),同时,根据信息的紧急程度,还可以分为紧急和普通(当然以后可能新增不紧急、特别紧急等等),桥接模式中类该怎么设计呢?

1.首先抽离出两个变化的维度:信息类型和和发信息的方式:

发信息接口:

1 interface SendMsgInterface {
2
3 public void sendMsg();
4
5 }

信息类型的抽象类:


 1 abstract class Msg {
2
3 private SendMsgInterface smi;
4
5 public Msg(SendMsgInterface smi) {
6 this.smi = smi;
7 }
8
9 public abstract void send();
10
11 }

2.定义Emil发送方式类和Sms方式发送类:


1 class EmailSendMsg implements SendMsgInterface{
2
3 @Override
4 public void sendMsg() {
5 System.out.println("Email 方式发送");
6 }
7
8 }


1 class SmsSendMsg implements SendMsgInterface{
2
3 @Override
4 public void sendMsg() {
5 System.out.println("Sms 方式发送");
6 }
7
8 }

3.定义紧急信息和普通信息类:


 1 class ImportantMsg extends Msg {
2
3 public ImportantMsg(SendMsgInterface smi) {
4 super(smi);
5 }
6
7 @Override
8 public void send() {
9 System.out.println("紧急信息");
10 }
11
12 }


 1 class NormalMsg extends Msg {
2
3 public NormalMsg(SendMsgInterface smi) {
4 super(smi);
5 }
6
7 @Override
8 public void send() {
9 System.out.println("普通信息");
10 }
11
12 }

4.客户端测试:


public class BridgeTest {

public static void main(String[] args) {
// 以手机短信发送发送紧急信息
SendMsgInterface smdSendMsg = new SmsSendMsg();
Msg importantMsg = new ImportantMsg(smdSendMsg);
importantMsg.send();
}

}

看,桥接模式对于多个维度的变化处理起来很有优势。

按照其他的模式定义,如外观模式需要增加一个外观类,代理模式需要增加一个代理类等,在如上的桥接模式设计中,其实Msg已经隐含的作为桥接的父类,当然,设计模式是死的,人是活的,其实也可以单独定义出一个专门用于桥接目的的桥接类。

设计模式总结篇系列:桥接模式(Bridge),布布扣,bubuko.com

时间: 2024-08-02 15:11:38

设计模式总结篇系列:桥接模式(Bridge)的相关文章

跟着实例学习设计模式(9)-桥接模式bridge(结构型)

桥接模式属于结构型设计模式. 设计意图:将抽象部分与实现部分分离,使它们都可以独立的变化. 一看到设计意图,大家可能有些发懵,我们看到的继承和接口不都是抽象和实现分离的吗?尤其是接口和抽象类都是这样的实现啊!那怎么还有这么个桥接的分离呢? 我们先来看个例子. 例如:汽车品牌内置导航仪,我们希望实现,每个品牌的导航仪都可以在任何一个牌子的汽车上安装并启动. 汽车品牌有两个:宝马.奔驰. 导航仪有三个牌子:神行者.北斗.高德. 来看正常的设计,我们肯定是会这样的采用继承来实现每个组合的安装和启动处理

【设计模式】桥接模式 Bridge Pattern

开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号,各种颜色种类繁多, 假如一盒蜡笔有24种颜色,那么它能涂抹出24种不同的颜色来,蜡笔型号是固定的,如果想画出各种线条那么就要购买不同型号的蜡笔,假如我们要涂抹出粗,中,细三种线条,那么我们就要买3盒粗,中,细型号的蜡笔才能满足需求,那么就是3盒*24色=72只蜡笔.假如使用毛笔来作画,我们需要准备3只粗,中,

设计模式总结篇系列:策略模式(Strategy)

前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结构型模式:主要侧重于处理类或对象的组合: 行为型模式:主要侧重于类或对象之间的交互以及职责分配. 首先了解下策略模式的概念:定义了多个算法,并将它们封装起来(一般的是每个算法封装成一个单独的类),让算法独立于客户端而可以单独变化. 具体可以看一下下面的例子(以计算加.减.乘为例): 1. 对加.减.

设计模式总结篇系列:外观模式(Facade)

张三自从毕业后开始做软件开发,做着做着发现不爽了,钱赚不了太多,头发也白了.于是拿着一点小资本,想着做点小生意.瞅着眼前的餐饮行业还不错,于是打算开一家餐馆.开参观可不是一件容易的事,仅仅行政类的审批流程就不少.至少包括办理卫生许可证,办理税务登记,办理工商登记等. 我们先来看一下行政审批接口: 1 interface Executive{ 2 3 public void approve(); 4 5 } 卫生局类的定义: 1 class HealthOffice implements Exec

设计模式总结篇系列:代理模式(Proxy)

时代在发展,我们发现,现在不少明星都开始进行微访谈之类的,有越来越多的参与捐赠等.新的一天开始了,首先看下新的一天的日程安排: 1 interface Schedule{ 2 3 public void weiTalk(); 4 5 public void donation(); 6 7 } Schedule接口定义了今天的形成安排,主要包括微访谈和捐款.那么看一下实现此接口的明星类定义: 1 class Star implements Schedule { 2 3 @Override 4 pu

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

设计模式总结篇系列:组合模式(Composite)

在探讨Java组合模式之前,先要明白几个概念的区别:继承.组合和聚合. 继承是is-a的关系.组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系. 组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象.如人和手之间的关系,人都没了,还何来手? 聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等

设计模式总结篇系列:建造者模式(Builder)

关于建造者模式网上有很多文章,也有些不同的理解.在此结合网上其他文章对建造者模式进行总结. 总体说来,建造者模式适合于一个具有较多的零件(属性)的产品(对象)的创建过程.根据产品创建过程中零件的构造是否具有一致的先后顺序,可以将其分为如下两种形式. 一.通过Client.Director.Builder和Product形成的建造者模式 Builder负责Product类对象的具体过程构建,Director负责指导Build,要求Builder按照其指定的顺序去完成Produt的构造.最后通过Bu

设计模式总结篇系列:工厂方法模式(Factory Method)

工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建.一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建. 根据具体产生类对象的方法定义形式,又可以将其分为普通工厂方法模式.多个工厂方法模式和静态工厂方法模式. 一.普通工厂方法模式: 常见的经典写法如下(以发送邮件和短信为例): 1.定义邮件类和短信类具有的共同接口: 1 interface Sender{ 2 3 public void sender(); 4 5 } 2.定义邮件类和短信类: 1 cl