桥接模式 订阅
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。 展开全文
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。
信息
别    称
柄体模式、接口模式
运用领域
软件系统
类    别
计算机术语
释    义
将抽象部分与它的实现部分分离,使它们都可以独立地变化
中文名
桥接模式
性    质
是一种对象结构型模式
桥接模式概述
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。 [1] 
收起全文
精华内容
参与话题
问答
  • 桥接模式: Bridge

    万次阅读 2019-08-21 18:08:17
    桥接模式是结构型模式 (Structural Patterns) 的一种. Making even a simple change to a monolithic codebase is pretty hard because you must understand the entire thing very well. Making changes to smaller...

    简介

    桥接模式是结构型模式 (Structural Patterns) 的一种.

    Making even a simple change to a monolithic codebase is pretty hard because you must understand the entire thing very well. Making changes to smaller, well-defined modules is much easier.
    

    如果软件系统中某个类存在多个独立变化的维度, 通过该模式可以将这多个维度分离出来, 使他们可以独立扩展, 让系统更加符合"单一职责原则 (SRP)". 与多层继承方案不同, 它将多个独立变化的维度设计为多个独立的继承等级结构, 并且在抽象层建立一个抽象关联, 该关联关系类似一条连接多个独立继承结构的桥, 故名桥接模式.

    桥接模式用一种巧妙的方式处理多层继承存在的问题, 用抽象关联取代了多层继承,将类之间的静态继承关系转换为动态的对象组合关系, 使得系统更加灵活, 并易于扩展, 同时有效控制了系统中类的个数.

    在这个例子中, 无论增加形状, 还是增加颜色, 都会导致子类数量快速增加. 解决方案是划分成两个独立变化的维度: Type 和 Color.

    84qp.gdhongkong.com|tdzdj.cn

    https|https

    abstract Shape(val shapeColor: ShapeColor) {
        abstract val shapeType: ShapeType
    }
    
    class Circle(val shapeColor: ShapeColor) : Shape(ShapeColor) {
        val shapeType = TypeCircle
        ...
    }
    
    class Square(val shapeColor: ShapeColor) : Shape(ShapeColor) {
        val shapeType = TypeSquare
        ...
    }
    

    Abstraction:拥有一个 Implementation 类型的对象引用
    Implementation:Implementation 和 Abstraction 接口并不一定完全一致,实际上这两个接口可以完全不一样, Implementation 提供具体操作方法,而 Abstraction 提供更高层次的调用
    Concrete Implementation:实现 Implementation 接口,给出具体实现
    Refined Abstraction:扩展 Abstraction 中的接口定义
    Client: 连接 Abstraction 和 Implementation

    应用场景

    一个应用/类越大, 弄清楚或改动的的代价就越大. 对于一个变体的改动可能会导致整个应用/类内的大量改动, 这经常会导致各种问题. Bridge 模式可以把应用/类拆分成多个独立的结构, 之后的改动就在各自的结构中, 让代码的改动影响最小化.

    展开全文
  • /// 被称之为结构型设计模式的巅峰之作 /// 组合+继承的融合应用 /// /// 能够任意扩展要求 还能调整顺序 /// </summary> public class Program { public static void Show() { { AbstractStudent...

    桥接模式(Bridge Pattern)

    桥接模式属于结构型模式,它将抽象部分与它的实现部分分离,使它们都可以相互独立地变化。

    利用面向对象的技术来使得某类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度,这就是桥接模式的核心意义。

    角色

    1、抽象(Abstraction)

    定义抽象接口,该接口中包含实现具体行为、具体特征的Implementor接口;

    2、扩充抽象(Refined Abstraction)

    继承自Abstraction的子类,依旧是一个抽象的事物名;

    3、实现(Implementor)

    定义具体行为,具体特征的应用接口;

    4、具体实现(ConcreteImplementor)

    Implementor的具体实现。

    示例

    在这里插入图片描述
    命名空间BridgePattern中包含电视机基类,3个具体电视机类,一个遥控器基类和1个具体遥控器类。本案例尝试使用桥接模式来解决如何用遥控器来遥控不同的电视机完成相应的动作。

    public abstract class Television {
    
        public abstract void TurnOn();
    
        public abstract void TurnOff();
    
        public abstract void TurnChannel();
    
    }
    

    电视机基Television类,包含打开电视TurnOn、关闭电视TurnOff、换台功能TurnChannel。

    public class Konka : Television {
    
        public override void TurnOn() {
            Console.WriteLine("Turn on Konka!");
        }
    
        public override void TurnOff() {
            Console.WriteLine("Turn off Konka!");
        }
    
        public override void TurnChannel() {
            Console.WriteLine("Turn channel Konka!");
        }
    
    }
    

    具体电视类,康佳Konka类。

    public class Lenovo : Television {
    
        public override void TurnOn() {
            Console.WriteLine("Turn on Lenovo!");
        }
    
        public override void TurnOff() {
            Console.WriteLine("Turn off Lenovo!");
        }
    
        public override void TurnChannel() {
            Console.WriteLine("Turn channel Lenovo!");
        }
    
    }
    

    具体电视类,联想Lenovo类。

    public class Panasonic : Television {
    
        public override void TurnOn() {
            Console.WriteLine("Turn on Panasonic!");
        }
    
        public override void TurnOff() {
            Console.WriteLine("Turn off Panasonic!");
        }
    
        public override void TurnChannel() {
            Console.WriteLine("Turn channel Panasonic!");
        }
    
    }
    

    具体电视类,松下Panasonic类。

    public class TeleControllerBase {
    
        public Television Television { get; set; }
    
        public virtual void TurnOn() {
            Television.TurnOn();
        }
    
        public virtual void TurnOff() {
            Television.TurnOff();
        }
    
        public virtual void TurnChannel() {
            Television.TurnChannel();
        }
    
    }
    

    遥控器基类TeleControllerBase类,内部维持一个电视机基类的引用,并包含对应的3个电视机功能。

    public class TeleController : TeleControllerBase {
    
        public override void TurnOff() {
            base.TurnOff();
            Console.WriteLine("-------------------------");
        }
    
    }
    

    具体遥控器TeleController类。

    public class Program {
    
        private static TeleControllerBase _teleController = null;
    
        public static void Main(string[] args) {
            _teleController = new TeleController();
    
            _teleController.Television = new Konka();
            _teleController.TurnOn();
            _teleController.TurnChannel();
            _teleController.TurnOff();
    
            _teleController.Television = new Lenovo();
            _teleController.TurnOn();
            _teleController.TurnChannel();
            _teleController.TurnOff();
    
            _teleController.Television = new Panasonic();
            _teleController.TurnOn();
            _teleController.TurnChannel();
            _teleController.TurnOff();
    
            Console.ReadKey();
        }
    
    }
    

    以上是调用方的代码,以下是这个案例的输出结果:

    Turn on Konka!
    Turn channel Konka!
    Turn off Konka!
    -------------------------
    Turn on Lenovo!
    Turn channel Lenovo!
    Turn off Lenovo!
    -------------------------
    Turn on Panasonic!
    Turn channel Panasonic!
    Turn off Panasonic!
    -------------------------
    

    优点

    1、抽象和实现的分离;
    2、优秀的扩展能力;
    3、实现细节对客户透明。

    缺点

    1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

    使用场景

    1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系;
    2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用;
    3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

    展开全文
  • 桥接模式

    千次阅读 2019-09-25 20:38:31
    桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式...我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来...

    桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

    这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

    我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。

    介绍

    意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

    主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

    何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

    如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

    关键代码:抽象类依赖实现类。

    应用实例 :1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。 2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

    优点 :1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

    缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

    使用场景 :1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

    注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。

    实现

    我们有一个作为桥接实现的 DrawApi 接口和实现了 DrawApi 接口的实体类 RedCircleGreenCircleShape 是一个抽象类,将使用 DrawApi 的对象。BridgePatternDemo,我们的演示类使用 Shape 类来画出不同颜色的圆。

    桥接模式

    步骤 1

    创建桥接实现接口。

    DrawApi.java

    public interface DrawApi {
    
        void drawCircle(int radius, int x, int y);
    
    }
    

    步骤 2

    创建实现了 DrawApi 接口的实体桥接实现类。

    RedCircle.java

    public class RedCircle implements DrawApi {
    
        @Override
        public void drawCircle(int radius, int x, int y) {
            System.out.println("Drawing Circle[ color: red, radius: "
                    + radius +", x: " +x+", y: "+ y +"]");
        }
    }
    

    GreenCircle.java

    public class GreenCircle implements DrawApi {
        @Override
        public void drawCircle(int radius, int x, int y) {
            System.out.println("Drawing Circle[ color: green, radius: "
                    + radius + ", x: " + x + ", y: " + y + "]");
        }
    }
    
    

    步骤 3

    使用 DrawApi 接口创建抽象类 Shape

    Shape.java

    public abstract class Shape {
    
        protected DrawApi drawApi;
    
        protected Shape(DrawApi drawApi) {
            this.drawApi = drawApi;
        }
    
        public abstract void draw();
    
    }
    

    步骤 4

    创建实现了 Shape 接口的实体类。

    Circle.java

    public class Circle extends Shape {
    
        int x, y, radius;
    
        protected Circle(int x, int y, int radius, DrawApi drawApi) {
            super(drawApi);
            this.x = x;
            this.y = y;
            this.radius = radius;
        }
    
        @Override
        public void draw() {
            drawApi.drawCircle(radius, x, y);
        }
    
    }
    

    步骤 5

    使用 ShapeDrawApi 类画出不同颜色的圆。

    BridgePatternDemo.java

    public class BridgePatternDemo {
    
        public static void main(String[] args) {
            Shape redCircle = new Circle(100, 100, 10, new RedCircle());
            Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());
    
            redCircle.draw();
            greenCircle.draw();
        }
    
    }
    

    步骤 6

    验证输出。

    Drawing Circle[ color: red, radius: 10, x: 100, y: 100]
    Drawing Circle[ color: green, radius: 10, x: 100, y: 100]
    
    展开全文

空空如也

1 2 3 4 5 ... 20
收藏数 19,878
精华内容 7,951
关键字:

桥接模式