C++设计模式

1、工厂模式
分类:简单工厂、工厂方法、抽象工厂
简单工厂:需要工厂类进行判断,从而创造相应的产品;当增加新的产品时,就要修改工厂类。有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核,客户需要什么样的处理器核,一定要显示地告诉工厂。缺点:要增加新的核类型时,就要修改工厂类,违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不能修改(允许平行扩展,不能修改类核方法的纵向扩展)
工厂方法:需要再开设一个工厂专门用来生产B型号的单核,而原来的工厂专门用来生产A型号。这时,客户要做的是找好工厂,比如要A型号的核,找A工厂要,否则找B工厂要,不需要告诉工厂具体要什么型号的处理器核。缺点:每增加一种产品,就需要增加一个 对象的工厂。相比简单工厂,工厂方法需要定义更多的类。
抽象工厂:这家公司的技术不断进步,不仅可以生产单核处理器,也可以生产多核处理器。抽象工厂提供一个创建一系列相关或相互依赖对象的接口,无需指定他们具体的类。一个专门用来生产A型号的单核多核处理器,另一个专门用来生产B型号的单核多核处理器。

2、策略模式
策略模式:是指定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。以高速缓存(Cache)的替换算法为例,实现策略模式。
什么是Cache的替换算法呢?简单解释一下,当发生Cache缺失时,Cache控制器必须选择Cache中的一行,并用欲获取的数据来替换它。
策略模式ReplaceAlgorithm是一个抽象类,定义了算法的接口,有三个类继承自这个抽象类,也就是具体的算法实现。Cache类中需要使用替换算法,因此维护一个ReplaceAlgorithm对象。

3、适配器模式
适配者模式:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容性而不能一起工作的那些类可以一起工作,包括类适配器核对象适配器。
在STL中就用到了适配器模式。STL实现了一种数据结构,称为双端队列(deque),支持前后两段的插入与删除。STL实现栈和队列时,没有从头开始定义它们,而是直接使用双端队列实现的。这里双端队列就扮演了适配器的角色。队列用到了它的后端插入,前端删除。而栈用到了它的后端插入,后端删除。假设栈和队列都是一种顺序容器,有两种操作:压入和弹出。下面给出相应的UML图,与DP上的图差不多。通过相同的接口,实现不同的功能,实现原本由于接口不兼容的而不能一起工作的两个类同时工作。

					//双端队列
					class Deque
					
					{
					
					public:
					
					void push_back(int x) { cout<<"Deque push_back"<<endl; }
					
					void push_front(int x) { cout<<"Deque push_front"<<endl; }
					
					void pop_back() { cout<<"Deque pop_back"<<endl; }
					
					void pop_front() { cout<<"Deque pop_front"<<endl; }
					
					};
					
					//顺序容器
					
					class Sequence
					
					{
					
					public:
					
					virtual void push(int x) = 0;
					
					virtual void pop() = 0;
					
					};
					
					//栈
					
					class Stack: public Sequence
					
					{
					
					public:
					
					void push(int x) { deque.push_back(x); }
					
					void pop() { deque.pop_back(); }
					
					private:
					
					Deque deque; //双端队列
					
					};
					
					//队列
					
					class Queue: public Sequence
					
					{
					
					public:
					
					void push(int x) { deque.push_back(x); }
					
					void pop() { deque.pop_front(); }
					
					private:
					
					Deque deque; //双端队列
					
					};

4、单例模式
单例模式:由于构造函数是私有的,因此无法通过构造函数实例化,唯一方法是通过调用静态函数GetInstance,对象唯一性。
单例模式

5、原型、模板模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。(原型)主要会使用到拷贝构造函数,通过拷贝创建出更多的原型。 原型模式CMyString::CMyString(const char* str){
if(str==NULL){
m_pdata=new char[1];
m_pdata[0]=’\0’;
}
else{
m_pdata=new char[strlen(str)+1];
strcpy(m_pdata,str);
}
}

CMyString::CMyString(const CMyString &str){
m_pdata=new char[strlen(str.m_pdata)+1];
strcpy(m_pdata,str.m_pdata);
CMyString* CMyString::Clone() {
return new CMyString(*this);
}
模板方法:需要按照特定的要求填写,使用模板方法模式:定义一个操作的算法的框架,将一些步骤延迟到子类中。模板方法使得子类可以不更改一个算法的结构即可重定义该算法的某些特定步骤。

6、建造者
7、外观、组合模式
外观模式:当一个系统很复杂时,系统提供给客户是一个简单的对外接口,而把里面复杂的结构都封装起来。客户只需要使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构。为子系统的一组接口提供一致的界面,外观模式定义了一个高层接口,里面接口具体实现操作,客户无需知道。
外观模式外观模式的特点:

(1)它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。

(2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。

(3)如果应用需要,它并不限制它们使用子系统类。

组合模式:表示“部分-整体”的层次结构。组合使得用户对单个对象核组合对象的使用具有一致性。总公司,有多个公司,分别都有人力、财务部等。

缺点:内存释放不好,需要客户手动进行释放

8、代理模式
9、亨元模式
10、桥接模式
11、装饰模式
装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活。比如给某个对象而不是整个类添加一些功能。一种灵活的设计是,将手机嵌入到另一对像中,由这个对象完成特性的添加,我们将这个其嵌入的对象为装饰。

装饰者模式 装饰模式:提供了更加灵活的向对象添加职责的方式。可以添加和分离的方法,用装饰在运行时增加和删除职责。装饰模式提供了一种“即用即付”的方式来添加职责。通过单独的装饰类来为它们添加特性,从而组合出复杂的功能。

12、备忘录模式
13、中介者模式
14、职责链模式
15、观察者模式
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都得到通知并被自动更新。它有两个别名,依赖(Dependents)、发布-订阅(Publish-Subscribe)。当博主发表新文章时,即博主状态发生改变,那些订阅者就会收到通知,然后进行相应的动作 。存在一对多的依赖关系。

观察者模式16、状态模式

转载至:https://blog.csdn.net/wuzhekai1985/column/info/design
以下是新的个人博客的地址:http://106.53.224.102:8080/wordpress-zh/feng_8071/搭建个人网盘-kodexplorer可道云/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值