C++设计模式(二)(摘录)

装饰模式
装饰模式:动态地给一个对象添加一些额外的功能,它是通过创建一个包装对象,也就是装饰来包裹真实的对象。新增加功能来说,装饰器模式比生产子类更加灵活。
以下情形考虑使用装饰模式:

需要扩展一个类的功能,或给一个类添加附加职责。需要动态的给一个对象添加功能,这些功能可以再动态的撤销。需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的
子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

和建造者模式的区别:
建造者模式要求建造的过程必须是稳定的,而装饰模式的建造过程是不稳定的,可以有各种各样的组合方式。

实例:
1.角色
(1)Component是定义一个对象,可以给这些对象动态地添加职责。

(2)ConcreteComponent是定义了一个具体的对象,也可以给这个对象增加一些职责。

(3)Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但是对于Component来说,是无需知道Decorator的存在的。

(4)至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的作用。

2.C++实现
(1)Conponent即ConcreteComponent类:此处为Person类

#ifndef PERSON_H
#define PERSON_H#include <string>
#include <iostream>
//ConcreteComponent即Component
class Person
{private:std::string name;
public:Person(){};Person(std::string name){this->name=name;}virtual void Show(){std::cout<<"装饰的"<<name<<std::endl;}
};#endif

(2)Decorator及ConcreteDecorator:此处为Finery及其子类

#ifndef FINERY_H
#define FINERY_H#include <iostream>
#include "Person.h"//Decorator类
class Finery:public Person
{protected:Person* component;
public:void Decorator(Person* component){this->component=component;}void Show(){if(component!=NULL)component->Show();}
};//下面是一系列ConcreteDecorator类
class TShirts:public Finery
{public:void Show(){std::cout<<"大T恤  ";Finery::Show();}};//ConcreteDecorator类
class BigTrouser:public Finery
{public:void Show(){std::cout<<"垮裤  ";Finery::Show();}};//ConcreteDecorator类
class Sneakers:public Finery
{public:void Show(){std::cout<<"破球鞋  ";Finery::Show();}};//ConcreteDecorator类
class Suit:public Finery
{public:void Show(){std::cout<<"西装  ";Finery::Show();}};//ConcreteDecorator类
class Tie:public Finery
{public:void Show(){std::cout<<"领带  ";Finery::Show();}};//ConcreteDecorator类
class LeatherShoes:public Finery
{public:void Show(){std::cout<<"皮鞋  ";Finery::Show();}};#endif

(3)客户端:main

#include "Finery.h"
#include <string>
#include <iostream>//客户端
void main()
{Person* xc=NULL;xc=new Person("小菜");std::cout<<"第一种装扮:"<<std::endl;Sneakers* pqx=NULL;pqx=new Sneakers();BigTrouser* kk=NULL;kk=new BigTrouser();TShirts* dtx=NULL;dtx=new TShirts();pqx->Decorator(xc);kk->Decorator(pqx);dtx->Decorator(kk);dtx->Show();std::cout<<"第二种装扮:"<<std::endl;LeatherShoes* px=NULL;px=new LeatherShoes();Tie* ld=NULL;ld=new Tie();Suit* xz=NULL;xz=new Suit();px->Decorator(xc);ld->Decorator(px);xz->Decorator(ld);xz->Show();if(xc!=NULL){delete xc;xc=NULL;}if(pqx!=NULL){delete pqx;pqx=NULL;}if(kk!=NULL){delete kk;kk=NULL;}if(dtx!=NULL){delete dtx;dtx=NULL;}if(px!=NULL){delete px;px=NULL;}if(ld!=NULL){delete ld;ld=NULL;}if(xz!=NULL){delete xz;xz=NULL;}system("pause");
}

代理模式
代理模式:为其它对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
优点:

职责清晰。真实的角色只负责实现实际的业务逻辑,不用关心其它非本职责的事务,通过后期的代理完成具体的
任务。这样代码会简洁清晰。代理对象可以在客户端和目标对象之间起到中介的作用,这样就保护了目标对象。扩展性好。

实现:

/*
* 关键代码:一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,
* 先访问代理类再访问真正要访问的对象。
*/
#include <iostream>
​
using namespace std;
​
class Gril
{public:Gril(const string& name = "gril"):m_string(name){}string getName(){return m_string;}
private:string m_string;
};
​
class Profession
{public:virtual ~Profession(){}virtual void profess() = 0;
};
​
class YoungMan : public Profession
{public:YoungMan(const Gril& gril):m_gril(gril){}void profess(){cout << "Young man love " << m_gril.getName().data() << endl;}
​
private:Gril m_gril;
};
​
class ManProxy : public Profession
{public:ManProxy(const Gril& gril):m_pMan(new YoungMan(gril)){}~ManProxy(){delete m_pMan;m_pMan = nullptr;}void profess(){m_pMan->profess();}
private:YoungMan* m_pMan;
};
​
int main(int argc, char *argv[])
{Gril gril("heihei");ManProxy* proxy = new ManProxy(gril);proxy->profess();
​delete proxy;proxy = nullptr;return 0;
}

桥接模式
桥接模式:将抽象部分与实现部分分离,使它们都可以独立变换。

以下情形考虑使用桥接模式:

当一个对象有多个变化因素的时候,考虑依赖于抽象的实现,而不是具体的实现。当多个变化因素在多个对象间共享时,考虑将这部分变化的部分抽象出来再聚合/合成进来。当一个对象的多个变化因素可以动态变化的时候。

优点:

将实现抽离出来,再实现抽象,使得对象的具体实现依赖于抽象,满足了依赖倒转原则。更好的可扩展性。可动态的切换实现。桥接模式实现了抽象和实现的分离,在实现桥接模式时,就可以实现动态的选择具体的实现。
/*
* 关键代码:将现实独立出来,抽象类依赖现实类。
* 以下示例中,将各类App、各类手机独立开来,实现各种App和各种手机的自由桥接。
*/
#include <iostream>
​
using namespace std;
​
//抽象App类,提供接口
class App
{public:virtual ~App(){ cout << "~App()" << endl; }virtual void run() = 0;
};
​
//具体的App实现类
class GameApp:public App
{public:void run(){cout << "GameApp Running" << endl;}
};
​
//具体的App实现类
class TranslateApp:public App
{public:void run(){cout << "TranslateApp Running" << endl;}
};
​
//抽象手机类,提供接口
class MobilePhone
{public:virtual ~MobilePhone(){ cout << "~MobilePhone()" << endl;}virtual void appRun(App* app) = 0;  //实现App与手机的桥接
};
​
//具体的手机实现类
class XiaoMi:public MobilePhone
{public:void appRun(App* app){cout << "XiaoMi: ";app->run();}
};
​
//具体的手机实现类
class HuaWei:public MobilePhone
{public:void appRun(App* app){cout << "HuaWei: ";app->run();}
};
​
int main()
{App* gameApp = new GameApp;App* translateApp = new TranslateApp;MobilePhone* mi = new XiaoMi;MobilePhone* hua = new HuaWei;mi->appRun(gameApp);mi->appRun(translateApp);hua->appRun(gameApp);hua->appRun(translateApp);
​delete hua;hua = nullptr;delete mi;mi = nullptr;delete gameApp;gameApp = nullptr;delete translateApp;translateApp = nullptr;
​return 0;
}

C++设计模式(二)(摘录)相关推荐

  1. 【白话设计模式二】外观模式(Facade)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  2. 【白话设计模式二十二】解释器模式(Interpreter)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  3. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

  4. java设计模式 (二) 创建模式

    java设计模式 (二) 创建型模式 单例模式 Singleton pattern 现实场景 双11, 小华收快递, 早上圆通快递叫他下楼收快递, 刚上来, 顺丰快递叫他下楼收快递,.然后没多久EMS ...

  5. 大话设计模式(二)代理模式

    大话设计模式(二)代理模式 前言 代理模式(Proxy Pattern)是GoF 23种Java常用设计模式之一.代理模式的定义:Provide a surrogate or placeholder ...

  6. Python设计模式二:接口类和抽象类(Python接口设计)

    系列文章目录 Python设计模式一:面向对象编程 文章目录 系列文章目录 前言 一.接口类和抽象类是什么? 基于接口编程而非实现 二.Python里如何实现接口类和抽象类? 三.接口类和抽象类的应用 ...

  7. 设计模式二:建造者模式

    建造者模式 想要创建一个由多个部分构成的对象,而且他的构成需要一步接一步地完成.只有当各个部分都创建好,这个对象才是完整的.这时就需要建造者模式 建造者设计模式:将一个复杂对象的构造过程与其表现分离, ...

  8. Spring框架中的设计模式(二)

    在上一篇中我们在Spring中所谈到的设计模式涉及到了创建模式三剑客和1个行为模式(解释器模式).这次我们会将眼光更多地关注在具有结构性和行为性的设计模式上. 在这篇文章中,我们将看到每个类型的两种模 ...

  9. 设计模式(二)__装饰设计模式

    今天呢,来给大家介绍一下装饰设计模式,java中IO就使用到了这个模式. 装饰设计模式,顾名思义,就是对一个功能进行装饰,就跟女人化妆一样,人还是本人,但是化了妆就变得比原来更漂亮了. 需求:当你有个 ...

  10. 观察者设计模式二:回调函数

    在上篇博客中具体介绍了观察者设计模式在异步短信发送中的应用场景,但是,在具体的业务中短息发送使用那种方式则会令代码很不友好: 这里我使用的是回调函数的方式来实现这个业务需求: 在具体的业务场景中,我们 ...

最新文章

  1. CSS Tricks网站创始人作序推荐,这本书助你成为Web开发高手
  2. 中国AI创新者论坛将于3月21日在清华大学举办
  3. Sql Server海量数据插入
  4. Java 比较相等 == or .equal()?
  5. 科大讯飞语音合成api
  6. 计算机基础知识二进步,大学计算机基础学习知识练习进步题(含规范标准答案).doc...
  7. mysql 有newid()_sql newid()随机函数
  8. 处理 git 合并冲突
  9. Coin-row problem(1139)
  10. 快速格式化代码(HTML、CSS)
  11. 基于FFmpeg接收RTSP的ts流
  12. 计算机组成原理作业三
  13. 用python证明给定范围的欧拉常数
  14. win10配置ffmpeg环境
  15. 从三点共线到四点共面
  16. QQ被盗如何找回好友
  17. html鼠标各种坐标,HTML坐标系与鼠标事件坐标
  18. 高效并发unsafe-星耀
  19. mysql double 使用_mysql double类型使用与主键自增
  20. todos各个组件代码

热门文章

  1. 系统内的在线协同富文本,如何寻求解决方案?
  2. 设备台式计算机显示叹号,电脑网络出现感叹号怎么解决?Win7系统网络出现感叹号的解决方法...
  3. 电脑怎么将两个屏幕设置成一个主屏幕
  4. es5的data语法_ES5与ES6数组方法总结
  5. 一位餐饮老板生意上的策略与心得
  6. 数据库的增删改查语法和多表联查方式
  7. 如何让自己每天都过得很充实很开心--论制定计划目标的重要性
  8. Oracle的表和视图的关系
  9. 卷积神经网络结构发展整理(全)
  10. 手机拍摄的视频太大怎么压缩?压缩视频这个方法就够了