一,概述
定义:将抽象部分与实现部分分离,使它们都可以独立的变化。
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
【注意】C++中继承声明为 public
二,示例
两款手机,品牌M和品牌N,且每部手机都包含通讯录和游戏。
1)第一种实现
实现:
以手机品牌为抽象基类,手机品牌M、N继承手机品牌基类。
再分别实现M、N中的游戏和通讯录类。
最后用爷爷类:手机品牌, 创建孙子类通讯录M(N)和游戏M(N)
缺点:
如果再增加一个MP3类则需要在手机M 和手机N下面各自加一个子类(相似的子类)
如果添加一个手机品牌则需要添加更多的类
#include <iostream>
using namespace std;
//手机品牌
class HandsetBrand
{
public:
virtual void Run()
{
}
};
//手机品牌M
class HandsetBrandM : public HandsetBrand
{
};
//手机品牌N
class HandsetBrandN : public HandsetBrand
{
};
//手机品牌M的游戏
class HandsetBrandMGame : public HandsetBrandM
{
public:
void Run()
{
cout<<"运行M品牌手机游戏"<<endl;
}
};
//手机品牌N的游戏
class HandsetBrandNGame : public HandsetBrandN
{
public:
void Run()
{
cout<<"运行N品牌手机游戏"<<endl;
}
};
//手机品牌M的通讯录
class HandsetBrandMAddressList :public HandsetBrandM
{
public:
void Run()
{
cout<<"运行M品牌手机通讯录"<<endl;
}
};
//手机品牌N的通讯录
class HandsetBrandNAddressList : public HandsetBrandN
{
public:
void Run()
{
cout<<"运行N品牌手机通讯录"<<endl;
}
};
int main()
{
HandsetBrand *ab;
ab = new HandsetBrandMAddressList();
ab->Run();
ab = new HandsetBrandMGame();
ab->Run();
ab = new HandsetBrandNAddressList();
ab->Run();
ab = new HandsetBrandNGame();
ab->Run();
}
合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。
聚合:表示一种“弱”的拥有关系,A对象可以包含B对象,但B对象不是A对象的一部分;大雁和大雁群的关系
合成:表示一种"强"的拥有关系,体现严格的整体和部分关系,且声明周期一样。大雁翅膀和大雁
类被封装后,被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为庞然大物。
2)另一种程序
将手机软件作为基类,让通讯录和游戏继承手机软件。然后不同手机品牌分别继承各自功能。
缺点:增加手机功能,或者是增加手机牌子都会有较大的改动。
#include <iostream>
using namespace std;
//手机软件
class HandsetSoft
{
public:
virtual void Run()
{
}
};
//通讯录
class HandsetAddressList : public HandsetSoft
{
};
//游戏
class HandsetGame : public HandsetSoft
{
};
//手机品牌M的游戏
class HandsetBrandMGame : public HandsetGame
{
public:
void Run()
{
cout<<"运行M品牌手机游戏"<<endl;
}
};
//手机品牌N的游戏
class HandsetBrandNGame : public HandsetGame
{
public:
void Run()
{
cout<<"运行N品牌手机游戏"<<endl;
}
};
//手机品牌M的通讯录
class HandsetBrandMAddressList : public HandsetAddressList
{
public:
void Run()
{
cout<<"运行M品牌手机通讯录"<<endl;
}
};
//手机品牌N的通讯录
class HandsetBrandNAddressList : public HandsetAddressList
{
public:
void Run()
{
cout<<"运行N品牌手机通讯录"<<endl;
}
};
int main()
{
HandsetSoft *ab;
ab = new HandsetBrandMGame();
ab->Run();
ab = new HandsetBrandNGame();
ab->Run();
ab = new HandsetBrandMAddressList();
ab->Run();
ab = new HandsetBrandNAddressList();
ab->Run();
}
3)松耦合的程序
手机品牌为抽象类,包含各个品牌的具体类。
手机软件为抽嫌累,包含通讯录、游戏等
手机软件作为手机品牌的一个成员方法从而构成手机
#include <iostream>
using namespace std;
//手机软件
class HandsetSoft
{
public:
virtual void Run()//;//虚函数实现多态 (必须有定义也有实现)
{
}
};
//手机游戏
class HandsetGame :public HandsetSoft
{
public:
void Run()
{
cout<<"运行手机游戏"<<endl;
}
};
//手机通讯录
class HandsetAddressList :public HandsetSoft
{
public:
void Run()
{
cout<<"运行手机通讯录"<<endl;
}
};
//手机MP3播放
class HandsetMP3 :public HandsetSoft
{
public:
void Run()
{
cout<<"运行手机MP3播放"<<endl;
}
};
//手机品牌
class HandsetBrand
{
protected:
HandsetSoft *soft;
//设置手机软件
public:
void SetHandsetSoft(HandsetSoft *sof)
{
this->soft = sof;
}
//运行
virtual void Run() //虚函数
{
}
};
//手机品牌N
class HandsetBrandN : public HandsetBrand
{
public:
void Run()
{
soft->Run();
}
};
//手机品牌M
class HandsetBrandM :public HandsetBrand
{
public:
void Run()
{
soft->Run();
}
};
//手机品牌S
class HandsetBrandS :public HandsetBrand
{
public:
void Run()
{
soft->Run();
}
};
int main()
{
HandsetBrand *ab;
ab = new HandsetBrandN();
ab->SetHandsetSoft(new HandsetGame());
ab->Run();
ab->SetHandsetSoft(new HandsetAddressList());
ab->Run();
ab = new HandsetBrandM();
ab->SetHandsetSoft(new HandsetGame());
ab->Run();
ab->SetHandsetSoft(new HandsetAddressList());
ab->Run();
}
三,桥接模式的基本代码
#include <iostream>
using namespace std;
class Implementor//各个小部件类(例如手机软件)
{
public:
virtual void Operation()//多态虚函数一定要有实现(提供给虚函数表入口地址)
{
}
};
class ConcreteImplementorA :public Implementor
{
public:
void Operation()
{
cout<<"具体实现A的方法执行"<<endl;
}
};
class ConcreteImplementorB :public Implementor
{
public:
void Operation()
{
cout<<"具体实现B的方法执行"<<endl;
}
};
class Abstraction //总的构成(类似手机品牌抽象类)
{
protected:
Implementor *implementor;
public:
void SetImplementor(Implementor *implementor)
{
this->implementor = implementor;
}
virtual void Operation()
{
implementor->Operation();
}
};
class RefinedAbstraction :public Abstraction
{
public:
void Operation()
{
implementor->Operation();
}
};
int main()
{
Abstraction *ab = new RefinedAbstraction();
ab->SetImplementor(new ConcreteImplementorA());//组合A到整体中
ab->Operation();
ab->SetImplementor(new ConcreteImplementorB());//组合B到整体中
ab->Operation();
system("pause");
}
分享到:
相关推荐
设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...
设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个压缩包文件名为"26种设计模式",其中可能详细介绍了软件开发中的26个核心设计模式。这些模式是经过时间检验、被广泛接受并反复使用...
设计模式是软件工程中的一种最佳实践,它是在特定情境下为了解决常见问题而形成的一套可重用的解决方案。这些模式是经验丰富的开发者在长期实践中总结出来的,并被广泛接受和应用于各种编程语言中。本资料包“常见的...
设计模式是软件工程中的一种最佳实践,用于解决在开发过程中经常遇到的问题,提供了一套可重用的解决方案。这份名为“设计模式PPT——25种设计模式详解”的资料,显然是一个深入探讨设计模式的教程,它通过PDF格式对...
设计模式则是软件体系结构中的重要组成部分,它们是经过时间检验的解决方案模板,用于解决常见的设计问题。在这个“软件体系结构---设计模式的Java运行代码案例”中,我们将深入探讨如何在Java编程环境中应用这些...
内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...
设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。GoF(Gang of Four)23种设计模式是软件开发中的经典,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。"设计模式可复用面向对象软件的基础"这一主题强调了设计模式在创建可维护、可扩展的面向对象软件中的核心作用。源码实现则为我们...
【Java桥接模式】是一种设计模式,用于将抽象部分与实现部分分离,使得它们可以独立进行变化。在上述场景中,我们看到一个典型的桥接模式应用:发送提示消息功能。 1. 场景问题: - 发送提示消息功能涉及到不同...
《设计模式精解-GoF 23种设计模式解析附C++实现源码 完整版》是一份深入探讨软件工程中经典设计模式的重要资料,涵盖了面向对象编程中的核心设计原则和实践。这份资源主要关注GoF(Gang of Four,即《设计模式:可...
设计模式是软件工程中的一种重要概念,它是在特定上下文中解决常见问题的模板或最佳实践。这些模式在软件开发过程中被广泛使用,因为它们提供了一种标准化的方法来处理复用性、灵活性和可维护性等问题。《软件设计...
设计模式是一种被广泛采用的、经过验证的解决方案,用于解决软件开发过程中常见的设计问题。它不仅帮助开发者编写可复用的代码,还促进了团队成员之间的有效沟通。设计模式通常包括以下几个部分: 1. **模式名称**...
《C#设计模式》是一本深入探讨C#编程语言中设计模式的专业书籍,它涵盖了软件开发中的各种经典设计模式,旨在提升代码的可维护性、可扩展性和复用性。设计模式是经过时间考验的解决方案,是软件工程中的宝贵经验结晶...
桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。...通过分析“桥接模式-概念图.edx”和“桥接模式-类图.edx”这两个文件,你可以更深入地理解和应用桥接模式。
设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,为软件开发提供了可复用的解决方案。在面向对象编程中,设计模式基于一些基本原则,这些原则构成了良好设计的基础。本篇将深入探讨23种设计...
设计模式是软件工程中经过实践验证的解决常见问题的模板,它们代表了在特定情境下,为了实现某种目标而采用的最佳实践。UML(统一建模语言)是描述这些模式的强大工具,它通过图表的形式,使得设计模式的概念更易于...
Java软件设计模式是软件开发中的重要概念,它们是经过时间考验的最佳实践,旨在解决常见的设计问题,提高代码的可读性、可维护性和可扩展性。以下是对标题和描述中涉及的一些关键知识点的详细说明: 1. **单一职责...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。这些模式经过时间的考验,被广泛应用于各种面向对象的软件开发中,以提高代码的可读性、可维护性和可复用性。本教程旨在深入讲解...
《研磨设计模式》是一本深入探讨软件设计原则与实践的经典书籍,其配套源代码提供了丰富的实例,帮助读者更好地理解和应用各种设计模式。这个UTF-8格式的压缩包包含了书中介绍的各种设计模式的实现,是学习和研究...
设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由GoF(Gang of Four)在他们的经典著作《设计模式:可复用面向对象软件的基础》中提出的,包括了23种不同的设计模式,旨在...