(精华)2020年8月28日 二十三种设计模式(七)-桥接模式(Bridge Pattern)

举报
愚公搬代码 发表于 2021/10/19 00:13:38 2021/10/19
【摘要】 桥接模式(Bridge Pattern) 桥接模式属于结构型模式,它将抽象部分与它的实现部分分离,使它们都可以相互独立地变化。 利用面向对象的技术来使得某类型能够轻松的沿着多个方向进行变化,而又不引入...

桥接模式(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();

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

电视机基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!");
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

具体电视类,康佳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!");
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

具体电视类,联想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!");
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

具体电视类,松下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();
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

public class TeleController : TeleControllerBase {

    public override void TurnOff() {
        base.TurnOff();
        Console.WriteLine("-------------------------");
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

具体遥控器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();
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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

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
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

优点

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

缺点

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

使用场景

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

文章来源: codeboy.blog.csdn.net,作者:愚公搬代码,版权归原作者所有,如需转载,请联系作者。

原文链接:codeboy.blog.csdn.net/article/details/107982800

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。