桥接模式:设计模式系列(十三)
in Archived / Pattern
桥接模式(Bridge Pattern):是一种让不同本质的两个实现类根据需要独立变化组合的设计模式,归类为结构型模式。
这一模式的解读分为以下几个方面:
- 不同本质的实现类可以互相组合。
- 组合方式根据实际需要而存在。
使用桥接模式的思考过程如下:
- 有一实现类需要与另一实现类组合成目的效果。
- 这是多对多的关系,但是并不是所有组合都需要。
- 把两者抽象出来,根据实际需要变化具体实现类。
明确一下结构,桥接模式结构包括实现类1、实现类1抽象出来的接口或协议、实现类2、实现类2抽象出来的接口或协议。
桥接模式示例代码如下(Swift语言):
protocol ObjectBluePrintA{
func sh();
}
class ObjectA1:ObjectBluePrintA{
var objectB:ObjectBluePrintB?;
init(objectB:ObjectBluePrintB){
self.objectB = objectB;
}
init(){
}
func sh(){
print("sh1");
objectB?.ow();
}
}
class ObjectA2:ObjectBluePrintA{
var objectB:ObjectBluePrintB?;
init(objectB:ObjectBluePrintB){
self.objectB = objectB;
}
init(){
}
func sh(){
print("sh2");
objectB?.ow();
}
}
protocol ObjectBluePrintB{
func ow();
}
class ObjectB1:ObjectBluePrintB{
func ow(){
print("ow1");
}
}
class ObjectB2:ObjectBluePrintB{
func ow(){
print("ow2");
}
}
var oa1:ObjectBluePrintA = ObjectA1();
var oa2:ObjectBluePrintA = ObjectA2();
oa1.sh();
oa2.sh();
var ob1:ObjectBluePrintB = ObjectB1();
var ob2:ObjectBluePrintB = ObjectB2();
oa1 = ObjectA1(objectB: ob1);
oa1.sh();
oa2 = ObjectA2(objectB: ob2);
oa2.sh();
oa1 = ObjectA1(objectB: ob2);
oa1.sh();
oa2 = ObjectA2(objectB: ob1);
oa2.sh();
代码分析:可以从以上代码发现,ObjectA1
和ObjectA2
是跟ObjectB1
和ObjectB2
互相独立的实现类,oa1
、oa2
在初始化后独立调用sh
方法也是没问题的,而之后假如需要用上遵循ObjectBluePrintB
的ObjectB1
或ObjectB2
的方法,则根据需求显式调用构造函数就可以了(这里只实现了A这一侧,其实B同时也实现也是可以的,那样更灵活,只是要注意是否有必要,而且必须小心出现强引用导致内存泄漏)。以上代码的输出结果如下:
sh1
sh2
sh1
ow1
sh2
ow2
sh1
ow2
总结:可以从结果中发现,桥接模式能按照需求灵活组合出需要的功能,而且本身在不组合的时候也不受影响,对于降低实现类之间的耦合是非常有用的模式,当发现遇到两个需要独立变化的类的时候,使用此模式诗歌不错的选择。