码迷,mamicode.com
首页 > 其他好文 > 详细

【结构型】Bridge模式

时间:2016-05-25 13:13:29      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

    桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化。简简单单的一句话,却已经是站在了更高抽象层面上来看待、设计、解决问题。平常我们多是对具体问题进行分析、抽象,然后就开始设计,这对多数情况下基本完全够用,毕竟实际项目中的功能模块都是找一“最优解的"实现来解决掉问题,把功能设计出来即可。这种情况下的结构关系图参考如下:

技术分享

    这种抽象设计的缺点是:如果解决问题的方式不止一种,则必需为以上所有Concrete类都是实现对应的具体版本,这样不但类继承体系十分复杂,后期只要随便增加一种实现方式,都将要增加N个对应的新class。为解决这类问题,需要将问题的具体实现剥离出来单独抽象,并在问题抽象层面与实现抽象层面做个关联桥接即可。从而在问题抽象层面上,就不需要关心当前问题是如何被解决的(即:如何实现的)。改进后的类关系图(即:Bridge模式的类关系图参考如下):

技术分享

    从关系图中可看出,不论是日后增加新Target,还是扩展新实现方式,对于逻辑结构都不需要做调整,也不会因为扩展了新的实现而引起整个Target系列的动荡。模式的编码结构参考如下:

 

技术分享
 1 namespace bridge
 2 {
 3     class IImpl;
 4     class ITarget
 5     {
 6     public:
 7         virtual void doSomething() = 0;
 8         // some code here........
 9 
10     protected:
11         IImpl* getImpl() { return _impl; }
12 
13     private:
14         IImpl* _impl;
15 
16     };//class ITarget
17 
18     class ConcreteTarget : public ITarget
19     {
20     public:
21         virtual void doSomething() override {
22             auto pImpl = this->getImpl();
23             if (nullptr != pImpl) {
24                 pImpl->realDoSomething();
25             }
26             // some other code here........
27         }
28 
29     };//class ConcreteTarget
30 
31     class IImpl
32     {
33     public:
34         virtual void realDoSomething() = 0;
35 
36     };//class IImpl
37 
38     class ConcreteImpl1 : public IImpl
39     {
40     public:
41         virtual void realDoSomething() override { /* some code here........ */ }
42 
43     };//class ConcreteImpl1
44 
45     class ConcreteImpl2 : public IImpl
46     {
47     public:
48         virtual void realDoSomething() override { /* some code here........ */ }
49 
50     };//class ConcreteImpl2
51 
52 }//namespace bridge
Bridge模式编码结构参考

 

【结构型】Bridge模式

标签:

原文地址:http://www.cnblogs.com/tongy0/p/5526116.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!