设计模式(七)桥接模式

本文介绍桥接模式在多维度设计中的应用,通过实例对比展示如何减少子类数量,避免违反单一职责原则,并遵循开闭原则。同时解释了聚合与组合的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言:

  1. 使用场景:
    当涉及到多维度时,也就是多层继承的情况时。

  2. 优点:

  • 抽象和实现的分离。
  • 优秀的扩展能力。
  • 实现细节对客户透明。
  1. 缺点:
    桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

2. 例子

使用继承实现时:
在这里插入图片描述
可以看出当要增加一个新的产品时,比如:LenoveDesktop,则需要影响到两个维度:电脑种类和品牌,任意一个元素不同就需要创造一个新的类来实现功能,结果就是子类将非常的多。
1> 这违反了单一职责原则:

一个类,只有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。例如:要实现逻辑和界面的分离。

2> 使用桥接由于使用聚合方式解决多重继承的问题,所以能够符合开闭原则

软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查,单元测试以及诸如此类的用以确保产品使用质量的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。

3> 聚合和组合的解释:

聚合
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
在这里插入图片描述

组合 (a拥有b,a没了b也就没了,实心)
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
在这里插入图片描述

当使用桥接模式实现时:
在这里插入图片描述
可以看出子类大大减少了。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>桥接模式</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>

</body>
<script>
    class Desktop{
        constructor(){}
        sale(){
            console.log("这是台式机");
        }
    }

    //品牌
    class Dell{
        //type是电脑类型
        constructor(type){
            this.Type = type;
        }

        sale(){
            this.Type.sale();
            console.log("这是dell电脑");
        }
    }


    class Computer{
        constructor(Brand){
            this.Brand = Brand;
        }

        sale(){
            this.Brand.sale();
        }
    }


    let dellDesktop = new Computer(new Dell(new Desktop()));
    dellDesktop.sale();

</script>
</html>

这里之所以使用这种嵌套式写法,主要是满足纯函数的需要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值