大话设计模式C++实现-第22章-桥接模式
一、UML图
二、概念
桥接模式(Bridge):将抽象部分与它的实现部分分离,使他们都能够独立地变化。
三、说明
为什么叫“桥接模式”?
如上所看到的的UML图中,有一个聚合线,像一座桥。所以叫“桥接模式”。
概念解释:
什么叫抽象与它的实现分离,这并非说。让抽象类与其派生类分离。由于这没有不论什么意义。实现指的是抽象类与它的派生类用来实现自己的对象。
为什么要优先使用合成/聚合原则?
(1)对象的继承关系是在编译时就定义好了的。所以无法再执行时改变从父类继承的实现。子类的实现与它的父类有很紧密的依赖关系。以至于父类实现的不论什么变化必定会导致子类发生变化。当你须要复用子类时。假设继承下来的实现不适合解决新的问题。则父类必须重写或被其它更适合的类替换。
这样的依赖关系限制了灵活性并终于限制了复用性。
(2)优先使用合成/聚合原则有助于你保持每一个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,而且不太可能增长为不可控制的庞然大物。
盲目使用继承会造成麻烦,本质原因是什么?
继承是一种强耦合的结构。
父类变,子类就必需要变。所以,我们在用继承时。一定要在是“is-a”的关系时再考虑使用,而不是不论什么时候都去使用。
四、C++实现
(1)Bridge.h
#ifndef BRIDGE_H
#define BRIDGE_H #include <iostream>
#include <string> //Implementor:此处为手机软件抽象类
class HandsetSoft
{
public:
virtual void Run()=0;
}; //ConcreteImplementorA,此处为手机游戏
class HandsetGame:public HandsetSoft
{
void Run()
{
std::cout<<"执行手机游戏"<<std::endl;
}
}; //ConcreteImplementorB,此处为手机通讯录
class HandsetAddressList:public HandsetSoft
{
void Run()
{
std::cout<<"执行手机通讯录"<<std::endl;
}
}; //Abstraction,此处为手机品牌抽象类
class HandsetBrand
{
protected:
HandsetSoft* soft;
public:
void SetHandsetSoft(HandsetSoft* soft)
{
this->soft=soft;
}
virtual void Run()=0;
}; //RefineAbstraction,此处为手机品N
class HandsetBrandN:public HandsetBrand
{
public:
void Run()
{
soft->Run();
}
}; //RefineAbstraction。此处为手机品M
class HandsetBrandM:public HandsetBrand
{
public:
void Run()
{
soft->Run();
}
}; #endif
(2)Client.cpp
#include "Bridge.h"
#include <iostream>
#include <cstdlib> //Client,client
void main()
{
//手机品牌N
std::cout<<"手机品牌N:"<<std::endl;
HandsetBrand* ab=new HandsetBrandN(); ab->SetHandsetSoft(new HandsetGame());
ab->Run(); ab->SetHandsetSoft(new HandsetAddressList());
ab->Run(); delete ab; //手机品牌M
std::cout<<std::endl<<"手机品牌M:"<<std::endl;
ab=new HandsetBrandM(); ab->SetHandsetSoft(new HandsetGame());
ab->Run(); ab->SetHandsetSoft(new HandsetAddressList());
ab->Run(); delete ab;
ab=NULL; std::cout<<std::endl;
system("pause");
}
(3)执行截图
大话设计模式C++实现-第22章-桥接模式的更多相关文章
- 大话设计模式C++达到-文章16章-国家模式
一.UML画画 二.概念 状态模式(State):当一个对象的内在状态改变时同意改变其行为.这个对象看起来像是改变了其类. 三.说明 以下是来自书本和网络的对状态模式的定义和分析: (1)状态模式同意 ...
- 大话设计模式C++达到-文章12章-外观模式
一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...
- 大话设计模式C++实现-文章7章-代理模式
一个.UML画画 二.概念 代理模式:为其它对象提供一种代理以控制对这个对象的訪问. 三.应用场景 (1)远程代理.也就是为一个对象在不同的地址空间提供局部代表.这样能够隐藏一个对象存在于不同地址空间 ...
- 大话设计模式C++实现-第19章-组合模式
一.UML图 关键词:Leaf是叶子,Composite是非叶子节点,Composite包括Leaf. 二.概念 组合模式(Composite):将对象组合成树形结构以表示"部分-总体&qu ...
- 设计模式之第22章-组合模式(Java实现)
设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...
- 设计模式之第10章-桥接模式(Java实现)
设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...
- 第7章 桥接模式(Bridge Pattern)
原文 第7章 桥接模式(Bridge Pattern) 定义: 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能 ...
- 大话设计模式C++实现-第1章-简单工厂模式
一.UML图 二.包括的角色 简单工厂模式包括三个角色: (1)工厂类Factory:工厂类是用来制造产品的. 因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类 ...
- 大话设计模式C++实现-第15章-抽象工厂模式
一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细 ...
随机推荐
- [转]Struts标签库详解
本文转自:http://hi.baidu.com/xzkcz/blog/item/5cf9f91f01beb9f4e0fe0bd4.html Struts提供了五个标签库,即:HTML.Bean. ...
- DouNet学习_收发邮件
一.收发邮件 --->第一步:发邮件首先要有发送者的邮箱地址和登录的密码才能发送 这些都写在APP里 不要写死 --->第二步:发邮件就要有网络,要添加net.Mail命名空间 要发送的 ...
- PHP时间格式控制符对照表
format 字符 说明 返回值例子 日 --- --- d 月份中的第几天,有前导零的 2 位数字 01 到 31 j 月份中的第几天,没有前导零 1 到 31 S 每月天数后面的英文后缀,2 个字 ...
- django1.77+mod_wsgi+python2.79+apache2.24 在阿里云centos部署攻略
心平气和的记录一下今天 踩的坑以防万一 以后还踩 首先我今天的平台是在 阿里云上的一台纯净版的 centos6.5 64位主机上进行的 首先装python2.7 去官网下载python2.7安装包 然 ...
- localStorage的一些简单的操作
本地存储 cookie localStorage cookie localStorage 生存周期 ...
- 在IT网站上少花些时间
我自己关注的IT网站还是蛮多的,经常去的有CSDN,博客园,51CTO,InfoQ,还有微博,微信上关注了IT程序猿,IT技术博客大学习,程序员之家, 开发者头条,还有还有,我还通过邮件订阅了码家周刊 ...
- Ubuntu下gdb远程调试--warning: Could not load vsyscall page because no executable was specified解决方案
1. 首先安装gdbserver apt-get install gdbserver 2. 编译-g 程序 gcc -g test_gdb.c -o test_gdb 源码如下: #include & ...
- LightOJ 1259 Goldbach`s Conjecture (哥德巴赫猜想 + 素数筛选法)
http://lightoj.com/volume_showproblem.php?problem=1259 题目大意:给你一个数n,这个数能分成两个素数a.b,n = a + b且a<=b,问 ...
- Cocos2d-x 关于在iOS平台真机测试的一些注意
下面简单记录一下在最近cocos2d-x项目在iOS平台真机测试和模拟器测试中遇到的一些要注意的地方(使用ipod): 1.图片大小 游戏中基本上都是会用到图片,那么在使用图片的时候要特别注意图片的s ...
- Objc基础学习记录5
NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendi ...