设计模式C++学习笔记之十一(Bridge桥梁模式)
桥梁模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。实现分离的办法就是增加一个类,
11.1.解释
main(),客户
IProduct,产品接口
CHouse,房子
CIPod,ipod
CClothes,服装
CNewCorp,桥梁类,MakeMoney()是桥梁方法
CNewHouseCorp,只能生产房子,所以构造函数是CHouse*
CShanZhaiCorp,什么赚钱就生产什么,所以构造函数是IProduct*
说明:客户直接使用CNewHouseCorp和CShanZhaiCorp类,在main()函数里构造产品,然后传到这两个类里。这两个类的MakeMoney()函数,先调用基类的MakeMoney(),然后分别执行各自的逻辑。
注意:CNewCorp起到了桥梁的作用。可以分别增加产品和公司。
看代码:
//NewCorp.h
#pragma once
#include "IProduct.h"
class CNewCorp
{
public:
CNewCorp(IProduct *pproduct);
virtual ~CNewCorp(void);
void MakeMoney();
private:
IProduct *m_pProduct;
};
//NewCorp.cpp
#include "StdAfx.h"
#include "NewCorp.h"
CNewCorp::CNewCorp( IProduct *pproduct )
{
this->m_pProduct = pproduct;
}
CNewCorp::~CNewCorp(void)
{
}
void CNewCorp::MakeMoney()
{
//每个公司都是一样,先生产
this->m_pProduct->BeProducted();
//然后销售
this->m_pProduct->BeSelled();
}
//NewHouseCorp.h
#pragma once
#include "newcorp.h"
#include "House.h"
class CNewHouseCorp :
public CNewCorp
{
public:
CNewHouseCorp(CHouse *pHouse);
~CNewHouseCorp(void);
void MakeMoney();
};
//NewHouseCorp.cpp
#include "StdAfx.h"
#include "NewHouseCorp.h"
#include <iostream>
using std::cout;
using std::endl;
CNewHouseCorp::CNewHouseCorp(CHouse *pHouse) : CNewCorp(pHouse)
{
}
CNewHouseCorp::~CNewHouseCorp(void)
{
}
void CNewHouseCorp::MakeMoney()
{
this->CNewCorp::MakeMoney();
cout << "房地产公司赚大钱了..." << endl;
}
//ShanZhaiCorp.h
#pragma once
#include "newcorp.h"
#include "IProduct.h"
class CShanZhaiCorp :
public CNewCorp
{
public:
CShanZhaiCorp(IProduct *pproduct);
~CShanZhaiCorp(void);
void MakeMoney();
};
//ShanZhaiCorp.cpp
#include "StdAfx.h"
#include "ShanZhaiCorp.h"
#include <iostream>
using std::cout;
using std::endl;
CShanZhaiCorp::CShanZhaiCorp(IProduct *pproduct) : CNewCorp(pproduct)
{
}
CShanZhaiCorp::~CShanZhaiCorp(void)
{
}
void CShanZhaiCorp::MakeMoney()
{
this->CNewCorp::MakeMoney();
cout << "我赚钱呀..." << endl;
}
//IProduct.h
#pragma once
class IProduct
{
public:
IProduct(void)
{
}
virtual ~IProduct(void)
{
}
virtual void BeProducted() = 0;
virtual void BeSelled() = 0;
};
//House.h
#pragma once
#include "iproduct.h"
class CHouse :
public IProduct
{
public:
CHouse(void);
~CHouse(void);
void BeProducted();
void BeSelled();
};
//House.cpp
#include "StdAfx.h"
#include "House.h"
#include <iostream>
using std::cout;
using std::endl;
CHouse::CHouse(void)
{
}
CHouse::~CHouse(void)
{
}
void CHouse::BeProducted()
{
cout << "生产出的房子是这个样子的..." << endl;
}
void CHouse::BeSelled()
{
cout << "生产出的房子卖出去了..." << endl;
}
//Clothes.h
#pragma once
#include "iproduct.h"
class CClothes :
public IProduct
{
public:
CClothes(void);
~CClothes(void);
void BeProducted();
void BeSelled();
};
//Clothes.cpp
#include "StdAfx.h"
#include "Clothes.h"
#include <iostream>
using std::cout;
using std::endl;
CClothes::CClothes(void)
{
}
CClothes::~CClothes(void)
{
}
void CClothes::BeProducted()
{
cout << "生产出的衣服是这个样子的..." << endl;
}
void CClothes::BeSelled()
{
cout << "生产出的衣服卖出去了..." << endl;
}
//IPod.h
#pragma once
#include "iproduct.h"
class CIPod :
public IProduct
{
public:
CIPod(void);
~CIPod(void);
void BeProducted();
void BeSelled();
};
//IPod.cpp
#include "StdAfx.h"
#include "IPod.h"
#include <iostream>
using std::cout;
using std::endl;
CIPod::CIPod(void)
{
}
CIPod::~CIPod(void)
{
}
void CIPod::BeProducted()
{
cout << "生产出的ipod是这个样子的..." << endl;
}
void CIPod::BeSelled()
{
cout << "生产出的ipod卖出去了..." << endl;
}
//
// Bridge.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "ClothesCorp.h"
#include "NewHouseCorp.h"
#include "Clothes.h"
#include "IPod.h"
#include "ShanZhaiCorp.h"
#include <iostream>
using std::cout;
using std::endl;
void DoNewRun1()
{
cout << "----------房地产公司是这样运行的----------" << endl;
CHouse house;
CNewHouseCorp newHouseCorp(&house);
newHouseCorp.MakeMoney();
cout << endl;
cout << "----------山寨公司是这样运行的----------" << endl;
CClothes clothes;
CShanZhaiCorp shanZhaiCorp(&clothes);
shanZhaiCorp.MakeMoney();
cout << endl;
}
void DoNewRun2()
{
cout << "----------房地产公司是这样运行的----------" << endl;
CHouse house;
CNewHouseCorp newHouseCorp(&house);
newHouseCorp.MakeMoney();
cout << endl;
cout << "----------山寨公司是这样运行的----------" << endl;
CIPod ipod;
CShanZhaiCorp shanZhaiCorp(&ipod);
shanZhaiCorp.MakeMoney();
cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
//只有两家公司,一家是房地产公司,另一家公司是衣服赚钱就生产衣服
DoNewRun1();
//只有两家公司,一家是房地产公司,另一家公司是ipod赚钱就生产ipod
DoNewRun2();
_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
_CrtDumpMemoryLeaks();
return 0;
}
桥梁模式(又可以称做桥接模式)属于结构型模式。CNewCorp实现了桥梁(桥接)的作用。
设计模式C++学习笔记之十一(Bridge桥梁模式)的更多相关文章
- 设计模式C++学习笔记之六(Facade门面模式)
Facade门面模式,也是比较常用的一种模式,基本上所有软件系统中都会用到. GOF 在<设计模式>一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义 ...
- 设计模式C++学习笔记之一(Strategy策略模式)
无意中,从网上下到一本电子书<24种设计模式介绍与6大设计原则>,很好奇这里有24种设计模式,印象中GOF写的<设计模式>(Design Patterns),好像只有23种吧. ...
- [ExtJS5学习笔记]第十一节 Extjs5MVVM模式下系统登录实例
本文地址:http://blog.csdn.net/sushengmiyan/article/details/38815923 实例代码下载地址: http://download.csdn.net/d ...
- VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式
原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Exce ...
- Python学习笔记(十一)
Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...
- angular学习笔记(三十一)-$location(2)
之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...
- angular学习笔记(三十一)-$location(1)
本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
随机推荐
- Centos6.6搭建Maven私服
操作系统:Centos6.6 私服Ip:10.0.210.112 JDK:1.7 (已安装并配置好了环境变量) 1:上 传 nexus-2.11.2-03-bundle.tar.gz到/root/ne ...
- linux安装Subversion版本控制工具(Subversion + Apache + jsvnadmin)
操作系统:Centos 6.7 集成环境服务器:10.0.210.112 操作用户:root 建议安装前更新操作系统 # yum update 更新完成后重启 # reboot 1: 安装 Apach ...
- Entity Framework 学习总结之十一:POCO
POCO Entity Framework 4.0 为实体提供了简单传统 CLR 对象( Plain Old CLR Object / POCO )支持.实体对象可以独立于 EF 存在,由此 EF 更 ...
- mybatis字符串转义问题
问题描述 @Select("select * from account order by #{orderBy} #{orderRule} limit #{start},#{offset}&q ...
- sql server中的merge
http://www.cnblogs.com/CareySon/archive/2012/03/07/2383690.html 简介 Merge关键字是一个神奇的DML关键字.它在SQL Server ...
- 13.CrawlSpider类爬虫
1.CrawlSpider介绍 Scrapy框架中分两类爬虫,Spider类和CrawlSpider类. 此案例采用的是CrawlSpider类实现爬虫. 它是Spider的派生类,Spider类的设 ...
- 关于“ubuntu18.04下网易云无法启动”的问题解决方案
1. 最简单的解决方案(参考文章:亢奋猫): 更正:在更改启动文件netease-cloud-music.desktop时应为:将第11行处的“Exec=netease-cloud-music %U” ...
- ubuntu 18.04//18.10&&windows 7/10双系统系统时间不一致
新版本的Ubuntu使用systemd启动之后,时间也改成了由timedatectl来管理,因此网上的许多方法就不适用了. 经过测试发现下面的方法可以解决双系统时间不一致问题: 1.将硬件时间UTC改 ...
- windows Apache 环境下配置支持HTTPS的SSL证书
windows Apache 环境下配置支持HTTPS的SSL证书 1.准备工作 1)在设置Apache + SSL之前, 需要做: 安装Apache, 下载安装Apache时请下载带有SSL版本的A ...
- day 8 - 1 文件操作
文件操作 注意: 1. r+ 最为常用 2.encoding 的编码格式一定要与文件编码格式一致 读取 r rb #在本地创建 txt 格式的文件默认使用 gbk 格式 f = open('e:/p ...