23 DesignPatterns学习笔记:C++语言实现 --- 2.1 Bridge

2016-07-22

(www.cnblogs.com/icmzn)



模式理解

 

1. Bridge模式的定义
    将抽象与实现解耦,使两个可以独立的发生变化。桥接模式的重点在“解耦”。
    一般桥接模式有以下四个角色
    (1)“抽象角色的抽象”:通过组合保留“实现橘色”的引用。
    (2)具体的“抽象角色”:通过组合引用的实现类,对实现类抽象进行操作处理。
    (3)“实现角色的抽象”:抽象类,定义实现角色必须的动作和行为。
    (4)具体的实现角色:完成实现类角色抽象的具体的实现。
    主要是通过抽象角色引用实现角色(组合的方式),或者是抽象角色的部分实现是实现角色提供的,
即实现角色通过实现角色的抽象的引用为抽象角色提供部分的实现支持。
即(4)通过(3)的必须的动作和行为接口为(1)的(2)完成部分或者全部的实现支持。

2. Bridge 模式的优点
(1)抽象与实现相分离
    解决的继承的缺点,因为继承严格限制了类之间的强关联关系,而Bridge模式则描述了一种类之间这种弱的关联关系,实现可以不受抽象的约束
,不需要被严格限制在抽象层面的。
(2)优秀的扩展能力
    抽象与实现都发生变化,从而实现“解耦”,扩充能力强
(3)抽象层通过聚合的方式,实现了对实现的封装。

3. Bridge 模式适用场景
(1)接口或者抽象类不明确的情况
(2)用继承存在问题,继承层次过度,无法进行更细致化的操作,需要使用桥接模式
(3)重用性要求较高,采用继承则严格收到父类的限制,不可以设计太细的颗粒度。
(4)在系统进行设计的时候,如果类的继承有N层,则可以考虑桥接模式。

4. Bridge 模式的讨论与注意
(1)继承的特征:可以把公共的方法或属性抽取,父类封装共性,子类实现特性,这是继承的基本运用。
    缺点:父类具有很强的入侵性,子类必须无条件接受父类的一切,并且父类的某个接口不能轻易改动,因为可能影响到底层的子类的执行。
    桥接模式Bridge:描述了类之间的弱的关联关系,可以吧可能会发生变化的方法放出去,对于关联关系很弱的,则考虑用桥接模式。



程序实现(C++)

AbsCorp.h

 1 #pragma once
 2
 3
 4 /*
 5     通过桥接模式,完成公司与产品的分离
 6     因为在公司是一个整体,产品是不断变化的,并且公司也是不断兼并重构的,二者都是发展变化的,不能同限制的继承的思想完成二者的处理。
 7     公司的通用特征是可以抽象的,产品的通用行为可以抽象,公司的子类可以对产品行为进行部分修改处理。具体的产品不同的属性方法可以特殊定义。
 8 */
 9 #include "AbsProduct.h"
10
11 //
12 class CAbsCorp
13 {
14 public:
15     CAbsCorp()
16     {
17         m_pProduct = nullptr;
18     }
19     ~CAbsCorp()
20     {
21         delete m_pProduct;
22     }
23     CAbsCorp(CAbsProduct* pProduct) : m_pProduct(pProduct){};
24
25 public:
26     virtual void setProduct(CAbsProduct*  pProduct)
27     {
28         _ASSERT(pProduct);
29         if (m_pProduct)
30             delete m_pProduct;
31         m_pProduct = pProduct;
32     }
33     virtual void makeMoney()
34     {
35         m_pProduct->toMake();
36         m_pProduct->toSell();
37     }
38     virtual void expendCrop() = 0;
39
40 protected:
41     CAbsProduct* m_pProduct;
42 };
43
44 class CCarCop : public CAbsCorp
45 {
46 public:
47
48     CCarCop(CAbsProduct* pProduct) : CAbsCorp(pProduct){};
49     void expendCrop() override
50     {
51         cout << "本CAr公司要做些特殊的事情" << endl;
52         m_pProduct->doSomethingSpecial();
53         cout << "本CAr公司要扩张..." << endl;
54     }
55 };
56
57 class CShanZhaiCop : public CAbsCorp
58 {
59 public:
60     CShanZhaiCop(CAbsProduct* pProduct) : CAbsCorp(pProduct){};
61     void expendCrop() override
62     {
63         cout << "本CShanZhaiCop公司要做些特殊的事情" << endl;
64         m_pProduct->doSomethingSpecial();
65         cout << "本CShanZhaiCop公司要扩张..." << endl;
66     }
67 };

AbsProduct.h

 1 #pragma once
 2
 3 #include <iostream>
 4 using namespace std;
 5
 6 class CAbsProduct
 7 {
 8 public:
 9     CAbsProduct();
10     ~CAbsProduct();
11 public:
12     virtual void toMake() = 0;
13     virtual void toSell() = 0;
14     virtual void doSomethingSpecial() = 0;
15 };
16
17
18 class CCarProduct : public CAbsProduct
19 {
20 public:
21     void toMake() override
22     {
23         cout << "汽车产品进行生产..." << endl;
24     }
25     void toSell() override
26     {
27         cout << "汽车产品进行销售..." << endl;
28     }
29     void doSomethingSpecial() override
30     {
31         cout << "汽车的市场调研分析..." << endl;
32     }
33 };
34
35 class CComputer : public CAbsProduct
36 {
37 public:
38     void toMake() override
39     {
40         cout << "Computer进行生产..." << endl;
41     }
42     void toSell() override
43     {
44         cout << "Computer进行销售..." << endl;
45     }
46
47     void doSomethingSpecial() override
48     {
49         cout << "Computer市场调研分析..." << endl;
50     }
51 };


(1)模板应用

main.cpp

 1 // Bridge.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include "AbsCorp.h"
 6
 7 #include <iostream>
 8 using namespace std;
 9
10 int _tmain(int argc, _TCHAR* argv[])
11 {
12     //一般公司的操作
13     cout << "\n\n一般公司操作...." << endl;
14     CAbsCorp* pCorp = new CCarCop(new CCarProduct());
15     pCorp->makeMoney();
16     pCorp->expendCrop();
17     delete pCorp;
18
19     //山寨公司的操作
20     cout << "\n\n山寨公司的操作山寨汽车...." << endl;
21     pCorp = new CShanZhaiCop(new CCarProduct());
22     pCorp->makeMoney();
23     pCorp->expendCrop();
24     cout << endl;
25     cout << "山寨公司要山寨所有的产品了...." << endl;
26     pCorp->setProduct(new CComputer());
27     pCorp->expendCrop();
28     pCorp->makeMoney();
29     delete pCorp;
30
31     system("pause");
32     return 0;
33 }

(2)输出展示

 

时间: 2024-09-30 20:55:10

23 DesignPatterns学习笔记:C++语言实现 --- 2.1 Bridge的相关文章

23 DesignPatterns学习笔记:C++语言实现 --- 2.7 Proxy

2016-07-18 (www.cnblogs.com/icmzn) 模式理解   1. Proxy 代理模式    为其他对象提供一种代理可以间接控制这个对象的访问.    又称为“委托模式”,其他设计模式也是在代理模式的基础上扩展的,如“策略模式”“状态模式”“访问者模式”,代理模式的特殊应用.在Spring的AOP技术,以及Struts的From元素映射就是代理行为.    一般代理具有多种版本(扩展)如:普通代理模式,强制代理模式,动态代理模式    一般代理的角色:    (1)CAb

23 DesignPatterns学习笔记:C++语言实现 --- 1.5 Prototype

2016-07-21 (www.cnblogs.com/icmzn) 模式理解 1. Prototype  原型模式定义    提供了类的自我复制的能力,即通过已有对象进行新对象的创建.因为原型模式实在内存中进行二进制流的拷贝,所以比直接通过new 一个对象性能好.不同的实现方式与具体的语言相关. 2. 原型模式的优点(1)性能优良,实在内存中基于二进制的拷贝(2)在进行原型模式的时候,并不通过构造函数. 3. 原型模式的适用场景(1)需要根据已有对象创建大量的对象:(2)某个对象的创建需要有大

23 DesignPatterns学习笔记:C++语言实现 --- 2.4 Composite

2016-07-22 (www.cnblogs.com/icmzn) 模式理解   1. Composite组合模式    又称为部分整体模式,主要用来描述部分与整体的关系.    将对象组合成树状结构以表示“部分-整体”的层次结构,是用户对“单个对象”和“组合对象”的使用具有一致性.    一般该模式具有三个角色:    (1)AbsComponent角色:一般为抽象父类,抽象“单个对象”“组合对象”公共的行为和方法,可以提供一些默认的方法或行为实现.    (2)Leaf角色:描述的是“单个

23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade

2016-07-22 (www.cnblogs.com/icmzn) 模式理解   1. 门面模式 facade ,又称为外观模式    要求所有外部与一个子系统的所有通信必须通过一个“统一的对象”进行.这个对象就是子系统的“门面”,即门面提供一个统一的调用接口,使得    子系统能够简单使用.    门面模式注重“统一的对象”,除了这个统一的对象外,不允许以其他方式调用子系统的行为发生.子系统可以是一个类对象或者一组对象的集合,更直观的    讲不管子系统内是多么杂乱无章,只要“统一对象”是简

23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter

2016-07-22 (www.cnblogs.com/icmzn) 模式理解 1. Adapter 定义    将一个类的接口变换为客户端所期待的另一种接口形式,使被适配者Adaptee能用用在目标target的环境中    一般可以分为以下角色:    (1)Target角色:        定义把其他类或者对象转化为的目标接口.通常为一个抽象类(接口).    (2)Adaptee角色:        定义被转化的类,它是已经存在的类或者对象    (3)Adapte角色:        

23 DesignPatterns学习笔记:C++语言实现 --- 2.5 Factory

2016-07-18 (www.cnblogs.com/icmzn) 模式理解   1. Flyweight 模式,即享元(共享单元)模式    Flyweeight是拳击比赛中的特有名词,称为“特轻量级别”,则在设计模式中指的的是类要轻量.类的粒度要细,可以实现细粒度类的复用,但没有缺乏共享的机制,即多线程下类不可复用.    享元模式,是“池技术”的重要实现方式,但二者并不等价.使用享元模式可以支持大量的细粒度的对象的共享.    因为创建太多的对象到程序中有损程序的性能,可以采用享元模式的

IOS学习笔记---C语言第四天

1 //?生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相 加,放到另外?一个数组中 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) 5 { 6 7 int num1[10]={0},num2[10]={0},num3[10]={0}; 8 for (int i = 0; i<10; i++) { 9 num1[i]=arc4random()%2

iOS学习笔记---c语言第十一天

函数指针 一.函数指针定义 //函数声明:声明我是一个什么函数 //求两个数的和 //函数的类型:int (int x,int y) //即:我是一个返回值为整型,有两个整型参数的函数. //函数名是 sum int sum(int x,int y); 函数指针定义p是变量,其他是类型(通常没有形参a,b) //函数指针类型 int (*)(int x,int y) //描述:指向 返回值为 int 两个int参数 的 指针类型 //函数指针变量: p //初始值 : sum printf("%

iOS学习笔记---c语言第九天

高级指针 指向结构体变量的指针,称为结构体指针 可以使用->指向内容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求两点间的距离  用的开方函数sqrt()和平方函数pow(,) { float a = sqrt(pow((p1->x-p2->x), 2)+pow((p1->y-p2->y), 2)); printf("两点距离为%.2f\n",a); } //main.m中代码 #import <Fou