桥接模式:设计模式系列(十三)

  桥接模式(Bridge Pattern):是一种让不同本质的两个实现类根据需要独立变化组合的设计模式,归类为结构型模式。

  这一模式的解读分为以下几个方面:

  • 不同本质的实现类可以互相组合。
  • 组合方式根据实际需要而存在。

  使用桥接模式的思考过程如下:

  1. 有一实现类需要与另一实现类组合成目的效果。
  2. 这是多对多的关系,但是并不是所有组合都需要。
  3. 把两者抽象出来,根据实际需要变化具体实现类。

  明确一下结构,桥接模式结构包括实现类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();

  代码分析:可以从以上代码发现,ObjectA1ObjectA2是跟ObjectB1ObjectB2互相独立的实现类,oa1oa2在初始化后独立调用sh方法也是没问题的,而之后假如需要用上遵循ObjectBluePrintBObjectB1ObjectB2的方法,则根据需求显式调用构造函数就可以了(这里只实现了A这一侧,其实B同时也实现也是可以的,那样更灵活,只是要注意是否有必要,而且必须小心出现强引用导致内存泄漏)。以上代码的输出结果如下:

sh1
sh2
sh1
ow1
sh2
ow2
sh1
ow2

  总结:可以从结果中发现,桥接模式能按照需求灵活组合出需要的功能,而且本身在不组合的时候也不受影响,对于降低实现类之间的耦合是非常有用的模式,当发现遇到两个需要独立变化的类的时候,使用此模式诗歌不错的选择。


lZackx © 2022. All rights reserved.

Powered by Hydejack v9.1.6