设计模式之桥梁模式20170721

行为型设计模式之桥梁模式:

一、含义

桥梁模式也叫做桥接模式,其定义如下:

将抽象和实现解耦,使得两者可以独立地变化。

只要记住一句话就行:抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色完成的。

二、代码说明

1.主要有四个角色

1)抽象化角色

它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类

2)实现化角色

它是接口或者抽象类,定义角色必须的行为和属性

3)修正抽象化角色

它引用实现化角色对抽象化角色进行修正

4)具体实现化角色

它实现接口或抽象类定义的方法和属性。

对于角色的理解,只要记住:抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色完成的。

2.在用C实现过程中也是参考这种思想,以公司和产品的关系举例,具体实现如下:

1)桥梁模式使用场景:

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     BridgePatternUsage.c
 5 * Description        :     桥梁模式的使用
 6
 7 [email protected]:/work/projects/test/DesignPatterns/BridgePattern$ gcc -o BridgePatternUsage IPodProduct.c HouseProduct.c ClothesProduct.c ShaizhaiCorp.c HouseCorp.c BridgePattern.c BridgePatternUsage.c
 8 [email protected]:/work/projects/test/DesignPatterns/BridgePattern$ ./BridgePatternUsage
 9 -----------------房地产公司是这样运行的----------------
10 生产出房子了...
11 生产出的房子卖出去了...
12 房地产公司赚大钱了...
13 ------------------山寨公司是这样运行的-----------------
14 生产出IPod了...
15 生产出的IPod卖出去了...
16 我赚钱啊...
17 生产出衣服了...
18 生产出的衣服卖出去了...
19 我赚钱啊...
20
21 * Created            :     2017.07.20.
22 * Author            :     Yu Weifeng
23 * Function List         :
24 * Last Modified     :
25 * History            :
26 ******************************************************************************/
27 #include"stdio.h"
28 #include"malloc.h"
29 #include"stdlib.h"
30 #include"string.h"
31 #include"BridgePattern.h"
32
33
34
35
36 /*****************************************************************************
37 -Fuction        : main
38 -Description    :
39 -Input            :
40 -Output         :
41 -Return         :
42 * Modify Date      Version         Author           Modification
43 * -----------------------------------------------
44 * 2017/07/20    V1.0.0         Yu Weifeng       Created
45 ******************************************************************************/
46 int main(int argc,char **argv)
47 {
48     T_Product tProduct=newHouseProduct;
49     printf("-----------------房地产公司是这样运行的----------------\r\n");
50     T_HouseCorp tHouseCorp=newHouseCorp(tProduct);
51     tHouseCorp.MakeMoney(&tHouseCorp);
52     printf("------------------山寨公司是这样运行的-----------------\r\n");
53     tProduct=(T_Product)newIPodProduct;
54     T_ShanzhaiCorp tShanzhaiCorp=newShanzhaiCorp(tProduct);
55     tShanzhaiCorp.MakeMoney(&tShanzhaiCorp);
56
57     tProduct=(T_Product)newClothesProduct;
58     tShanzhaiCorp=(T_ShanzhaiCorp)newShanzhaiCorp(tProduct);
59     tShanzhaiCorp.MakeMoney(&tShanzhaiCorp);
60
61
62
63     return 0;
64 }

BridgePatternUsage.c

2)被调用者:

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     BridgePattern.c
 5 * Description        :     桥梁模式
 6                         本文件是抽象公司类的实现
 7                         以公司和产品的关系举例
 8
 9 * Created            :     2017.07.20.
10 * Author            :     Yu Weifeng
11 * Function List         :
12 * Last Modified     :
13 * History            :
14 ******************************************************************************/
15 #include"stdio.h"
16 #include"malloc.h"
17 #include"stdlib.h"
18 #include"string.h"
19 #include"BridgePattern.h"
20
21 /*****************************************************************************
22 -Fuction        : MakeMoney
23 -Description    : 公有函数
24 -Input            :
25 -Output         :
26 -Return         :
27 * Modify Date      Version         Author           Modification
28 * -----------------------------------------------
29 * 2017/07/20      V1.0.0         Yu Weifeng       Created
30 ******************************************************************************/
31 void MakeMoney(T_Corp *i_ptThis)
32 {
33     i_ptThis->tProduct.BeProducted();
34     i_ptThis->tProduct.BeSelled();
35 }

BridgePattern.c

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     BridgePattern.h
 5 * Description        :     桥梁模式
 6
 7 * Created            :     2017.07.20.
 8 * Author            :     Yu Weifeng
 9 * Function List         :
10 * Last Modified     :
11 * History            :
12 ******************************************************************************/
13 #ifndef BRIDGE_PATTERN_H
14 #define BRIDGE_PATTERN_H
15
16 typedef struct Product
17 {
18     void (*BeProducted)();
19     void (*BeSelled)();
20
21 }T_Product;//实现化角色
22
23 typedef struct Corp
24 {
25     T_Product tProduct;//不同公司不同产品,所以定义在外面//构造传入,同时私有变量不可直接访问
26
27     void (*MakeMoney)(struct Corp *ptThis);//抽象出公司的职责 赚钱
28 }T_Corp;//抽象化角色
29
30 typedef struct HouseCorp
31 {
32     T_Corp tFatherCorp;//继承
33     void (*MakeMoney)(struct HouseCorp *ptThis);
34 }T_HouseCorp;//修正抽象化角色
35
36 typedef struct ShanzhaiCorp
37 {
38     T_Corp tFatherCorp;
39     void (*MakeMoney)(struct ShanzhaiCorp *ptThis);
40 }T_ShanzhaiCorp;//修正抽象化角色
41
42 void MakeMoney(T_Corp *i_ptThis);
43
44 void ShanzhaiCorpMakeMoney(T_ShanzhaiCorp *i_ptThis);
45 #define newShanzhaiCorp(Product) {Product,MakeMoney,ShanzhaiCorpMakeMoney}
46
47 void HouseCorpMakeMoney(T_HouseCorp *i_ptThis);
48 #define newHouseCorp(Product) {Product,MakeMoney,HouseCorpMakeMoney}
49
50
51 void HouseBeProducted();
52 void HouseBeSelled();
53 #define newHouseProduct {HouseBeProducted,HouseBeSelled}
54
55 void IPodBeProducted();
56 void IPodBeSelled();
57 #define newIPodProduct {IPodBeProducted,IPodBeSelled}
58
59 void ClothesBeProducted();
60 void ClothesBeSelled();
61 #define newClothesProduct {ClothesBeProducted,ClothesBeSelled}
62
63
64 #endif

BridgePattern.h

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     HouseCorp.c
 5 * Description        :     桥梁模式
 6                         本文件是房地产公司的实现类
 7
 8 * Created            :     2017.07.20.
 9 * Author            :     Yu Weifeng
10 * Function List         :
11 * Last Modified     :
12 * History            :
13 ******************************************************************************/
14 #include"stdio.h"
15 #include"malloc.h"
16 #include"stdlib.h"
17 #include"string.h"
18 #include"BridgePattern.h"
19
20 /*****************************************************************************
21 -Fuction        : HouseMakeMoney
22 -Description    : 公有函数
23 -Input            :
24 -Output         :
25 -Return         :
26 * Modify Date      Version         Author           Modification
27 * -----------------------------------------------
28 * 2017/07/20      V1.0.0         Yu Weifeng       Created
29 ******************************************************************************/
30 void HouseCorpMakeMoney(T_HouseCorp *i_ptThis)
31 {
32     i_ptThis->tFatherCorp.MakeMoney(&i_ptThis->tFatherCorp);
33     printf("房地产公司赚大钱了...\r\n");
34 }

HouseCorp.c

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     ShanzhaiCorp.c
 5 * Description        :     桥梁模式
 6                         本文件是房地产公司的实现类
 7
 8 * Created            :     2017.07.20.
 9 * Author            :     Yu Weifeng
10 * Function List         :
11 * Last Modified     :
12 * History            :
13 ******************************************************************************/
14 #include"stdio.h"
15 #include"malloc.h"
16 #include"stdlib.h"
17 #include"string.h"
18 #include"BridgePattern.h"
19
20 /*****************************************************************************
21 -Fuction        : ShanzhaiMakeMoney
22 -Description    : 公有函数
23 -Input            :
24 -Output         :
25 -Return         :
26 * Modify Date      Version         Author           Modification
27 * -----------------------------------------------
28 * 2017/07/20      V1.0.0         Yu Weifeng       Created
29 ******************************************************************************/
30 void ShanzhaiCorpMakeMoney(T_ShanzhaiCorp *i_ptThis)
31 {
32     i_ptThis->tFatherCorp.MakeMoney(&i_ptThis->tFatherCorp);
33     printf("我赚钱啊...\r\n");
34 }

ShanzhaiCorp.c

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     HouseProduct.c
 5 * Description        :     桥梁模式
 6                         本文件是产品角色房子的实现类(具体实现化角色)
 7
 8 * Created            :     2017.07.20.
 9 * Author            :     Yu Weifeng
10 * Function List         :
11 * Last Modified     :
12 * History            :
13 ******************************************************************************/
14 #include"stdio.h"
15 #include"malloc.h"
16 #include"stdlib.h"
17 #include"string.h"
18 #include"BridgePattern.h"
19
20
21 /*****************************************************************************
22 -Fuction        : HouseBeProducted
23 -Description    : 公有函数
24 -Input            :
25 -Output         :
26 -Return         :
27 * Modify Date      Version         Author           Modification
28 * -----------------------------------------------
29 * 2017/07/20      V1.0.0         Yu Weifeng       Created
30 ******************************************************************************/
31 void HouseBeProducted()
32 {
33     printf("生产出房子了...\r\n");
34 }
35
36 /*****************************************************************************
37 -Fuction        : HouseBeSelled
38 -Description    : 公有函数
39 -Input            :
40 -Output         :
41 -Return         :
42 * Modify Date      Version         Author           Modification
43 * -----------------------------------------------
44 * 2017/07/20      V1.0.0         Yu Weifeng       Created
45 ******************************************************************************/
46 void HouseBeSelled()
47 {
48     printf("生产出的房子卖出去了...\r\n");
49 }

HouseProduct.c

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     IPodProduct.c
 5 * Description        :     桥梁模式
 6                         本文件是产品角色IPod的实现类(具体实现化角色)
 7
 8 * Created            :     2017.07.20.
 9 * Author            :     Yu Weifeng
10 * Function List         :
11 * Last Modified     :
12 * History            :
13 ******************************************************************************/
14 #include"stdio.h"
15 #include"malloc.h"
16 #include"stdlib.h"
17 #include"string.h"
18 #include"BridgePattern.h"
19
20
21 /*****************************************************************************
22 -Fuction        : IPodBeProducted
23 -Description    : 公有函数
24 -Input            :
25 -Output         :
26 -Return         :
27 * Modify Date      Version         Author           Modification
28 * -----------------------------------------------
29 * 2017/07/20      V1.0.0         Yu Weifeng       Created
30 ******************************************************************************/
31 void IPodBeProducted()
32 {
33     printf("生产出IPod了...\r\n");
34 }
35
36 /*****************************************************************************
37 -Fuction        : IPodBeSelled
38 -Description    : 公有函数
39 -Input            :
40 -Output         :
41 -Return         :
42 * Modify Date      Version         Author           Modification
43 * -----------------------------------------------
44 * 2017/07/20      V1.0.0         Yu Weifeng       Created
45 ******************************************************************************/
46 void IPodBeSelled()
47 {
48     printf("生产出的IPod卖出去了...\r\n");
49 }

IPodProduct.c

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     ClothesProduct.c
 5 * Description        :     桥梁模式
 6                         本文件是产品角色衣服的实现类(具体实现化角色)
 7
 8 * Created            :     2017.07.20.
 9 * Author            :     Yu Weifeng
10 * Function List         :
11 * Last Modified     :
12 * History            :
13 ******************************************************************************/
14 #include"stdio.h"
15 #include"malloc.h"
16 #include"stdlib.h"
17 #include"string.h"
18 #include"BridgePattern.h"
19
20
21 /*****************************************************************************
22 -Fuction        : ClothesBeProducted
23 -Description    : 公有函数
24 -Input            :
25 -Output         :
26 -Return         :
27 * Modify Date      Version         Author           Modification
28 * -----------------------------------------------
29 * 2017/07/20      V1.0.0         Yu Weifeng       Created
30 ******************************************************************************/
31 void ClothesBeProducted()
32 {
33     printf("生产出衣服了...\r\n");
34 }
35
36 /*****************************************************************************
37 -Fuction        : ClothesBeSelled
38 -Description    : 公有函数
39 -Input            :
40 -Output         :
41 -Return         :
42 * Modify Date      Version         Author           Modification
43 * -----------------------------------------------
44 * 2017/07/20      V1.0.0         Yu Weifeng       Created
45 ******************************************************************************/
46 void ClothesBeSelled()
47 {
48     printf("生产出的衣服卖出去了...\r\n");
49 }

ClothesProduct.c

3)执行结果:

[email protected]:/work/projects/test/DesignPatterns/BridgePattern$ gcc -o BridgePatternUsage IPodProduct.c HouseProduct.c ClothesProduct.c ShaizhaiCorp.c HouseCorp.c BridgePattern.c BridgePatternUsage.c

[email protected]:/work/projects/test/DesignPatterns/BridgePattern$ ./BridgePatternUsage

-----------------房地产公司是这样运行的----------------

生产出房子了...

生产出的房子卖出去了...

房地产公司赚大钱了...

------------------山寨公司是这样运行的-----------------

生产出IPod了...

生产出的IPod卖出去了...

我赚钱啊...

生产出衣服了...

生产出的衣服卖出去了...

我赚钱啊...

4)详细代码:

https://github.com/fengweiyu/DesignThinking/tree/master/DesignPatterns/StructuralDesignPatterns/BridgePattern

三、使用场景

1.不希望或不适用使用继承的场景

例如继承层次过度,无法更细化设计颗粒等场景,需要考虑使用桥梁模式。

2.接口或抽象类不稳定的场景

明知道接口不稳定还想通过实现或继承来实现业务需求,那是得不偿失的,也是比较失败的做法。

3.重用性要求较高的场景

设计的颗粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出现太细的颗粒度

4.继承与桥梁模式之间的选择

1)继承的缺点,父类有一个方法,子类也必须有这个方法,这会带来扩展性问题,比如Father类有个方法A,Son继承了这个方法,然后GrandSon也继承了这个方法,如果有一天Son要重写父类的这个方法,那么GrandSon使用的方法就会被改变(不再是从Father继承过来的方法A),这个风险太大。

2)桥梁模式就是这一问题的解决方法,桥梁模式描述了类间弱关联关系,上面例子使用桥梁模式就可以解决:Father把那个可能会变化的方法放到另一个类,其他类要使用则与那个类建立桥梁来获得。

因此,对于比较明确不发生变化的,则通过继承来完成;若不能确定是否会发生变化的,那就认为是会发生变化,则通过桥梁模式来解决。

四、优点

1.抽象和实现分离

这也是桥梁模式的主要特征,它完全是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上。

2.优秀的扩充能力

只要对外暴露的接口层允许这样的变化,就可以扩充。

3.实现细节对客户透明

客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装

五、注意事项

1.使用该模式时主要考虑如何拆分抽象和实现,并不是一涉及继承就要考虑使用该模式

桥梁模式的意图还是对变化的封装,尽量把可能变化的因素封装到最细、最小的逻辑单元中,避免风险扩散。因此在进行系统设计时,发现类的继承有N层时,可以考虑使用桥梁模式。

六、与其他模式的区别

1、桥梁模式与策略模式的区别:

策略模式是一个行为模式,旨在封装一系列的行为;

而桥梁模式则是在不破坏封装的情况下抽取出它的抽象部分和实现部分,它的前提是不破坏封装,让抽象部分和实现部分都可以独立地变化。

简单来说,桥梁模式必然有两个“桥墩”---抽象化角色和实现化角色(抽象化角色(抽象的 如公司)调用实现化角色(具体的 如产品(公司生产的))),只要桥段搭建好,桥就有了,而策略模式只有一个抽象角色,可以没有实现,也可以很多实现。

2、桥梁模式与其他包装模式的区别:

包装模式讲解完毕后说明

时间: 2024-12-26 02:13:17

设计模式之桥梁模式20170721的相关文章

设计模式之桥梁模式

桥梁模式亦是结构型设计模式的一种,从名字上理解,像是连接两个元素的一种模式,差不多可以这么理解,但桥梁模式并非是像适配器模式一样适配不适应的两个类的. 桥梁模式连接的抽象和实现,为了达到抽象和实现这两部分都能变化的目的,必须使用桥梁的聚合作用来达到.这里的抽象部分和实现部分不是我们通常认为的抽象父类和实现子类的关系,而是组合关系.实现部分是被抽象部分调用,以用来完成(实现)抽象部分的功能. 系统设计中,总是充满了变数,那么采取什么样的设计能较好的解决变化带给系统的影响?一般来说,设计原则是将不变

java设计模式之桥梁模式(Bridge)

1.桥梁模式 与 策略模式 非常相似 (其实很多设计模式都相似,因为所有的模式都是按照设计原则 而设计出来的,设计原则就相当于武功的心法,设计模式就是招式,只要心法过硬,就可以无招胜有招了.) 这里也有比较详细的说明 策略模式 VS 桥梁模式 (画画,使用蜡笔和使用毛笔以及颜料的区别) 好了,这里先说 桥梁模式,最后再总结两者的区别 2.桥梁模式(还是那样,设计模式就是为了代码健壮,代码重用,所以高内聚,低耦合永远都是那么受欢迎,什么抽象类啊,接口啊···) 场景,农民施肥. 这里农民类 调用

设计模式之桥梁模式和策略模式的区别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 举一个例子: 策略模式:我要画圆,要实心圆,我可以用solidPen来配置,画虚线圆可以用dashedPen来配置.这是strategy模式. 桥接模式:同样是画圆,我是在windows下来画实心圆,就用windowPen+solidPen来配置,在unix下画实心圆就用uni

设计模式之桥梁模式和策略模式的差别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.下面是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 举一个样例: 策略模式:我要画圆.要实心圆,我能够用solidPen来配置.画虚线圆能够用dashedPen来配置. 这是strategy模式. 桥接模式:相同是画圆,我是在windows下来画实心圆.就用windowPen+solidPen来配置.在unix下画实心圆就用un

JAVA设计模式之桥梁模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”. 桥梁模式的用意 桥梁模式虽然不是一个使用频率很高的模式,但是熟悉这个模式对于理解面向对象的设计原则,包括“开-闭”原则以及组合/聚合复用原则都很有帮助.理解好这两个原则,有助于形成正确

java 设计模式 之 桥梁模式

桥梁模式:将抽象和实现解耦,使两者可以独立的变化.解释:将两个有组合关系,强耦合的对象,各自抽象然后解耦.(类关系图看https://www.cnblogs.com/blogxiao/p/9513883.html 这篇文章) 下面以公司生产产品为例子. 1.小汽车公司生产小汽车.这里有两个对象:汽车公司和小汽车.这两个是聚合的关系.类关系图如下: 业务逻辑就是:汽车公司生产汽车产品 2.缺点:扩展性差,当有是个产品需要生产的时候,此时需要在往这里面的增加十个产品类.当有多个公司生产多个产品的时候

设计模式_桥梁模式

Bridge Pattern Decouple an abstraction from its implementation so that the two can vary independently.(将抽象和实现解耦.使得倆者能够独立的变化) 样例 "天下熙熙,皆为利来.天下攘攘,皆为利往"  现实和结构分开 服装公司 ="服装"+"公司" ="服装公司" 解耦之前是服装公司.写一个Corp公司抽象类.然后即可了.解耦后

Java设计模式(五)外观模式 桥梁模式

(九)外观模式 外观模式为子系统提供一个接口,便于使用.解决了类与类之间关系的,外观模式将类之间的关系放在一个 Facade 类中,降低了类类之间的耦合度,该模式不涉及接口. class CPU { public void startup(){ System.out.println("cpu start"); } public void shutdown(){ System.out.println("cpu stop"); } } class Memory { pu

设计模式之禅之设计模式-桥梁模式

一:桥梁模式定义        --->桥梁模式(Bridge Pattern)也叫做桥接模式,是一个比较简单的模式        --->将抽象和实现解耦,使得两者可以独立地变化. 二:桥梁模式角色 ● Abstraction——抽象化角色        它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类.● Implementor——实现化角色        它是接口或者抽象类,定义角色必需的行为和属性.● RefinedAbstraction——修正抽象