设计模式【七】:桥接

设计模式【七】:桥接

伪代码

class ExampleClass{
public:
	ExampleClass(ExampleImp* imp){
		_imp = imp;
	}
	
	//requests handled by example class
	virtual void exampleClassMethod1();
	virtual void exampleClassMethod2();

	//requests forwarded to implementation
	virtual void exampleImpMethod1();
	virtual void exampleImpMethod2();

private:
	ExampleImp* _imp;
}

class ImpClass{
	// ...
}
class ConcreteImp1: public ImpClass{
	//...
}
class ConcreteImp2: public ImpClass{
	//...
}

class ConcreteClass1: public ExampleClass{
public:
	ConcreteClass1();
	// ...
}
ConcreteClass1::exampleImpMethod1(){
	_imp->method1();
}

ConcreteClass1 class1Imp1 = new ConcreteClass1(new ConcreteImp1());
ConcreteClass1 class1Imp2 = new ConcreteClass1(new ConcreteImp2());
ConcreteClass2 class2Imp1 = new ConcreteClass2(new ConcreteImp1());
ConcreteClass2 class2Imp2 = new ConcreteClass2(new ConcreteImp2());

优缺点

优点
  • 将接口与具体实现解耦。更改实现类(伪代码中的ImpClass)不影响接口。
  • 更好的可扩展性。抽象类与实现类可以分别扩展。
  • 更简洁的继承树。注意,在伪代码中我们为了得到四个实例,设计了2+2=4个类,而不是22=4个类,这是特殊情况。假如我们为了得到六个实例,采用桥接模式我们设计2+3=5个类,而不是采用树形继承结构的23=6个类。

何时使用

  • 需要避免接口与实现的永久绑定,比如需要运行时切换实现方式。
  • 接口与是实现分别需要继承,而且可能需要将不同层次的继承组合起来。
  • 不希望抽象类的实现更改导致重编译。
  • 希望在不同接口之间共享实现。

实现时技巧

  • 假如只有一个实现类时,可能不需要桥接模式。因为此时桥接模式需要n+1个类,而树形继承仅需n个类。
  • 注意对多个实现类的管理。比如设置一个哈希表存储所有实现类,这样在接口的构造函数就可以选择对应的实现类。或者在构造函数使用默认的类,在实例化后根据实际情况更改设置。
  • 考虑共享实现类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值