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>
这里之所以使用这种嵌套式写法,主要是满足纯函数的需要。