设计模式(9)桥接模式

桥接模式简介

为了便于理解,先举个实际生活中的例子,比如,工厂里面有多个车间,车间1内有类型A的机器,车间2有类型B的机器,然后,新引进了一个类型C的机器,那么总不至于为了这个机器C在新建一个车间3吧?
实际的情况是,一个车间可以使用不同的类型机器,只要车间够大,甚至可以将所有类型的机器都放在一个车间里。
首先,一个车间里必须有相应的机器,车间和机器之间有将强的耦合,但是不同的机器之间无任何耦合,而且,新建一个车间后,同时可以将现有的机器迁移过去继续使用。车间和机器之间有耦合,但是两者可以很好的解耦,而且解耦合可以很灵活的扩展。

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。

桥接模式将两个独立变化的维度,设计成两个独立的继承等级结构(而不会将两者耦合在一起形成多层继承结构),在抽象层将二者建立起一个抽象关联,该关联关系类似一座桥,将两个独立的等级结构连接起来,因此叫做桥接模式。

桥接模式结构

桥接模式UML图如下图:
在这里插入图片描述
由图可知,桥接模式有以下角色,

  • Abstraction(抽象类):定义抽象类的接口(抽象接口),由聚合关系可知,抽象类中包含一个Implementor类型的对象,它与Implementor之间有关联关系,既可以包含抽象业务方法,也可以包含具体业务方法;
  • Implementor(实现类接口):定义实现类的接口,这个接口可以与Abstraction类的接口不同。一般而言,实现类接口只定义基本操作,而抽象类的接口还可能会做更多复杂的操作。
  • RefinedAbstraction(扩充抽象类):具体类,实现在抽象类中定义的接口,可以调用在Implementor中定义的方法;
  • ConcreteImplementor(具体实现类):具体实现了Implementor接口,在不同的具体实现类中实现不同的具体操作。运行时ConcreteImplementor将替换父类。

桥接模式代码实例

BridgePattern.h

#include <iostream>
#include <string.h>
#include <mutex>

using namespace std;

//实现类接口
class Machine
{
    
    
public:
  Machine() {
    
    }
  virtual void work() = 0;

private:
};

class MachineA : public Machine
{
    
    
public:
  MachineA() {
    
    }
  void work()
  {
    
    
    cout << " MachineA work !" << endl;
  }
};

class MachineB : public Machine
{
    
    
public:
  MachineB() {
    
    }
  void work()
  {
    
    
    cout << " MachineB work !" << endl;
  }
};

//抽象类 WorkShop
class WorkShop
{
    
    
public:
  WorkShop(){
    
    }
  
  //安装机器
  virtual void setupMachine(Machine *imachine) = 0;
  virtual void work() = 0;

private:
  Machine *machine;
};

//扩充抽象类 WorkShopA
class WorkShopA : public WorkShop
{
    
    
public:
  WorkShopA() {
    
    }

  //安装机器
  void setupMachine(Machine *imachine)
  {
    
    
    this->machine = imachine;
  }

  void work()
  {
    
    
    this->machine->work();
  }

private:
  Machine *machine;
};

//扩充抽象类 WorkShopB
class WorkShopB : public WorkShop
{
    
    
public:
  WorkShopB() {
    
    }

  //安装机器
  void setupMachine(Machine *imachine)
  {
    
    
    this->machine = imachine;
  }

  void work()
  {
    
    
    this->machine->work();
  }

private:
  Machine *machine;
};

BridgePattern.cpp

#include <iostream>
#include "BridgePattern.h"

int main()
{
    
    
	Machine *machine;
	WorkShop *workshop;

	workshop = new WorkShopA();
	machine = new MachineA();
	workshop->setupMachine(machine);
	workshop->work();
	
  	cout << "=================" << endl;

	delete machine;
	machine = new MachineB();
	workshop->setupMachine(machine);
	workshop->work();

	delete machine;
	delete workshop;

	return 0;
}

桥接模式总结

优点:

分离抽象接口与实现部分,使用对象间的关联关系使抽象与实现解耦;

  • 桥接模式可以取代多层继承关系,多层继承违背单一职责原则,不利于代码复用;
  • 桥接模式提高了系统可扩展性,某个维度需要扩展只需增加实现类接口或者具体实现类,而且不影响另一个维度,符合开闭原则。

缺点:

  • 桥接模式难以理解,因为关联关系建立在抽象层,需要一开始就设计抽象层;
  • 如何准确识别系统中的两个维度是应用桥接模式的难点。

适用场景:

  • 如果一个系统需要在抽象化和具体化之间增加灵活性,避免在两个层次之间增加继承关系,可以使用桥接模式在抽象层建立关联关系;
  • 抽象部分和实现部分可以各自扩展而互不影响;
  • 一个类存在多个独立变化的维度,可采用桥接模式。

猜你喜欢

转载自blog.csdn.net/qq_24649627/article/details/115351858
今日推荐