设计模式(6)桥接模式
桥接模式
情景
桥接模式的目的是将一个大类或者一系列类拆分为抽象和实现两个层次。
桥接模式
一个Shape类,可以扩展两个形状 Circle 和 Square 。希望每一个形状还有两颜色,进而Shape会有四个子类。这样的话我们需要添加的类会越变越多。比如说我们再加一个三角形的子类就需要加上两个子类。
解决方案
一件物品可以有多种属性,比如长、宽、颜色。我们不妨把这三种属性都单独拎出来做一个类,这样通过组合来实现一个新的类。假设长、宽、高分别有n、m、k个子类,共计n+m+k个子类,而使用朴素方法就有nmk个子类。这大大简化了代码的复杂度。
我们把每一个物品的属性都看作是抽象的,而我们需要提供一些API来组合他们。
class Implementation{
public:
virtual ~Implementation(){}
virtual std::string OperationImplementation() const = 0;
};
class ConcreteImplementationA() : public Implementation{
public:
std::string OperationImplementation() const override{
return "Here's A";
}
};
class ConcreteImplementationB() : public Implementation{
public:
std::string OperationImplementation() const override{
return "Here's B";
}
};
class Abstraction(){
protected:
Implementation* _implementation;
public:
Abstaction(Implementation* implementation): _implementation(implementation){}
virtual ~Abstration(){}
virtual std::string Operation()const{
return "This is"+this->_implementation->OperationImplementation();
}
};
class ExtendedAbstraction:public Abstraction{
public:
ExtendedAbstraction(Implementation* implementation):Abstraction(implementation){}
std::string Operation()const override {
return "Ex is"+this->_implementation->OperationImplementation();
}
};
总结
- 想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式。桥接模式可以将庞杂类拆分为几个类层次结构。 此后, 你可以修改任意一个类层次结构而不会影响到其他类层次结构。 这种方法可以简化代码的维护工作, 并将修改已有代码的风险降到最低。
- 如果你希望在几个独立维度上扩展一个类, 可使用该模式。桥接建议将每个维度抽取为独立的类层次。 初始类将相关工作委派给属于对应类层次的对象, 无需自己完成所有工作。
- 如果你需要在运行时切换不同实现方法, 可使用桥接模式。