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

1.模式动机

设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:

  • 第一种设计方案是为每一种形状都提供一套各种颜色的版本。
  • 第二种设计方案是根据实际需要对形状和颜色进行组合

对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。

当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。

2.模式定义

桥接模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

它是一种对象结构型模式

桥接模式的优点是:

  • 由于抽象与实现分离,所以扩展能力强;
  • 其实现细节对客户透明。

缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。

3.模式结构

桥接模式包含以下主要角色:

  • 抽象类(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象类(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现类(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现类(Concrete Implementor)角色:给出实现化角色接口的具体实现。

4.模式代码

# 实现类角色
public interface IColor {
    String name();
}

# 具体实现类角色
public class OrangeColor implements IColor {
    @Override
    public String name() {
        return "Orange";
    }
}
public class YellowColor implements IColor {
    @Override
    public String name() {
       return "Yellow";
    }
}

# 抽象类角色
public abstract class AbstractDrawShape {

    protected IColor color;

    public AbstractDrawShape(IColor color) {
        this.color = color;
    }

    public abstract void draw();

}

# 扩展抽象类角色
public class DrawRoundShape extends AbstractDrawShape {

    public DrawRoundShape(IColor color) {
        super(color);
    }

    @Override
    public void draw() {
        System.out.println("颜色为 " + color.name() + " 的圆形");
    }
}
public class DrawSquareShape extends AbstractDrawShape {

    public DrawSquareShape(IColor color) {
        super(color);
    }

    @Override
    public void draw() {
        System.out.println("颜色为 " + color.name() + " 的正方形");
    }
}

5.总结

理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。

桥接模式的应用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

原文地址:https://www.cnblogs.com/wuqinglong/p/12335063.html

时间: 2024-10-26 20:30:59

设计模式-08桥接模式(Bridge Pattern)的相关文章

如何让孩子爱上设计模式 ——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实体类 //

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

1.意图 将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 类的抽象与它的实现都应该可以通过子类的方式加以扩展. 抽象部分与实现部分可以独立变化,而不会相互影响. 从多维度扩展应用程序. 3.结构 4.参与者 Abstraction: 定义抽象的接口:维护一个指向Implementor对象的引用. RefinedAbstraction: 扩充有Abstracttion定义的接口. Implementor: 定义实现类的接口,

php桥接模式(bridge pattern)

有点通了 <?php /* The bridge pattern is used when we want to decouple a class or abstraction from its implementation, allowing them both to change independently. This is useful when the class and its implementation vary often */ interface MessagingInterf

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

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

8.桥接模式(Bridge Pattern)

using System; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { // 创建一个遥控器 RemoteControl remoteControl = new ConcreteRemote(); // 长虹电视机 remoteControl.Implementor = new ChangHong(); remoteControl.On(); remoteControl.Set

设计模式之桥接模式 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("销售戴尔电脑"); } }

设计模式——7.桥接模式

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