设计模式之桥接模式(Bridge)--结构模型

1.意图

将抽象部分与它的实现部分分离,使它们可以独立地变化.

2.适用性

  • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
  • 类的抽象与它的实现都应该可以通过子类的方式加以扩展。
  • 抽象部分与实现部分可以独立变化,而不会相互影响。
  • 从多维度扩展应用程序。

3.结构

4.参与者

  • Abstraction: 定义抽象的接口;维护一个指向Implementor对象的引用。
  • RefinedAbstraction: 扩充有Abstracttion定义的接口。
  • Implementor: 定义实现类的接口,该接口不一定要与Abstraction接口完全一致,事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
  • ConcreteImplementor: 实现Implementor接口并定义它具体实现。

5.效果

1) 分离接口及其实现部分。
2) 提供可扩展性。
3) 实现细节对客户透明。

6.实例

1)场景

在消息发送的场景中,消息类型抽象为普通消息和紧急消息,发送实现方式为邮件和短信。使用桥接模式,既可以在消息类型的维度上增加各种类型抽象,也可以在发送方式维度上增加各种实现方式。两者独立变化,实现解耦的效果。

2)UML图

3)代码

AbstractMessage抽象类

  1. public abstract class AbstractMessage {
  2. protected ISendMethod sm;
  3. public AbstractMessage(ISendMethod sm) {
  4. super();
  5. this.sm = sm;
  6. }
  7. public void sendMessage(String str){
  8. this.sm.send(str);
  9. }
  10. }

CommonMessage类

  1. public class CommonMessage extends AbstractMessage{
  2. public CommonMessage(ISendMethod sm) {
  3. super(sm);
  4. // TODO Auto-generated constructor stub
  5. }
  6. @Override
  7. public void sendMessage(String str) {
  8. // TODO Auto-generated method stub
  9. super.sendMessage(str);
  10. }
  11. }

UrgentMessage类

  1. public class UrgentMessage extends AbstractMessage{
  2. public UrgentMessage(ISendMethod sm) {
  3. super(sm);
  4. // TODO Auto-generated constructor stub
  5. }
  6. @Override
  7. public void sendMessage(String str) {
  8. // TODO Auto-generated method stub
  9. str += "(Urgent!!!)";
  10. this.sm.send(str);
  11. }
  12. }

ISendMethod接口

  1. public interface ISendMethod {
  2. public void send(String str);
  3. }

SendEmail类

  1. public class SendEmail implements ISendMethod {
  2. @Override
  3. public void send(String str) {
  4. // TODO Auto-generated method stub
  5. System.out.println("This is a email message:"+ str);
  6. }
  7. }

SendSms类

  1. public class SendSms implements ISendMethod {
  2. @Override
  3. public void send(String str) {
  4. // TODO Auto-generated method stub
  5. System.out.print("This a sms message:" + str);
  6. }
  7. }

Main测试类

  1. public class Main {
  2. public static void main(String[] args){
  3. ISendMethod sender = new SendEmail();
  4. AbstractMessage aMessage = new UrgentMessage(sender);
  5. aMessage.sendMessage("Test");
  6. ISendMethod sender2 = new SendSms();
  7. AbstractMessage aMessage2 = new CommonMessage(sender2);
  8. aMessage2.sendMessage("Test2");
  9. }
  10. }


输出结果

This is a email message:Test(Urgent!!!)
This a sms message:Test2

来自为知笔记(Wiz)

附件列表

时间: 2024-10-05 14:41:19

设计模式之桥接模式(Bridge)--结构模型的相关文章

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

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

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

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

二十四种设计模式:桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象部分和实现部分分离. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Bridge { /// <summary> /// Message实体类 //

设计模式-08桥接模式(Bridge Pattern)

1.模式动机 设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色.绿色.蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状都提供一套各种颜色的版本. 第二种设计方案是根据实际需要对形状和颜色进行组合 对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便.设计方案二即是桥接模式的应用.桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量. 当然,这

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

前言:[模式总览]——————————by xingoo 模式意图 这个模式使用的并不多,但是思想确实很普遍.就是要分离抽象部分与实现部分. 实现弱关联,即在运行时才产生依赖关系. 降低代码之间的耦合. 模式结构 Abstraction 抽象部分的基类,定义抽象部分的基础内容. RefinedAbstraction 抽象部分的扩充,用于对基类的内容补充,添加特定场景的业务操作. Implementor 实现部分的基类,定义实现部分的基本内容. ConcreteImplementor 具体的实现类

设计模式之桥接模式 Bridge

代码实现 public interface Brand { void sale(); } class Lenovo implements Brand{ @Override public void sale() { System.out.println("销售联想电脑"); } } class Dell implements Brand{ @Override public void sale() { System.out.println("销售戴尔电脑"); } }

设计模式入门之桥接模式Bridge

//桥接模式定义:将抽象部分与它的实现部分分离,使得他们都可以独立地变化 //广义来讲,桥接模式非常普遍,面向抽象编程,面向接口编程就可以看作是他的体现 //实例:一个系统,要按照不同的要求发信息(普通,加急,特急),而且还要以不同的方式发送(站内信,Email,短信)等,考虑到其扩展性,用桥接模式再合适不过了 //上代码 //桥接的一半---抽象部分 public abstract class AbstractionMessage { protected MessageImplementor

【设计模式】——桥接模式

桥接模式(Bridge),将抽象部分与它的实现部分分离,使他们都可以独立地变化. 什么是抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义.实现指的是抽象类和它的派生类用来实现自己的对象.实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合.也就是说在我们发现需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放-封闭原则时,就应该考虑用桥接模式. 桥接模式基本代码 #include <iostrea

设计模式之桥接模式(八)

设计模式之桥接模式 一.引言 每个人都有吃饭睡觉的行为,这时我们可以抽象出来一个人类型,然后让每个人去继承人类型,这时,每增加一个人,我们只需扩展一个子类就可以了,但是,人类型需要增加行为时,比如增加一个玩手机的行为,我们只许在人类型中扩展玩手机这一个方法,但是对于子类来说,如果这时子类数量相当庞大时,子类需要进行大量的修改. 我们可以使用桥接模式,将抽象和实现分离. 二.介绍 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象