zoukankan      html  css  js  c++  java
  • C++实现设计模式之-装饰模式

    饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。

    具体代码:

      1 // decoratortest.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <iostream>
      6 #include <string>
      7 using namespace std;
      8 
      9 
     10 class Phone
     11 
     12 {
     13 
     14 public:
     15     Phone() {}
     16 
     17     virtual ~Phone() {}
     18 
     19     virtual void ShowDecorate() {}
     20 
     21 };
     22 
     23 class iPhone : public Phone
     24 
     25 {
     26 
     27 private:
     28 
     29     string m_name; //手机名称
     30 
     31 public:
     32 
     33     iPhone(string name): m_name(name){}
     34 
     35     ~iPhone() {}
     36 
     37     void ShowDecorate() { cout<<m_name<<"的装饰"<<endl;}
     38 
     39 };
     40 
     41 //具体的手机类
     42 
     43 class NokiaPhone : public Phone
     44 
     45 {
     46 
     47 private:
     48 
     49     string m_name;
     50 
     51 public:
     52 
     53     NokiaPhone(string name): m_name(name){}
     54 
     55     ~NokiaPhone() {}
     56 
     57     void ShowDecorate() { cout<<m_name<<"的装饰"<<endl;}
     58 
     59 };
     60 
     61 //装饰类
     62 
     63 class DecoratorPhone : public Phone
     64 
     65 {
     66 
     67 private:
     68 
     69     Phone *m_phone;  //要装饰的手机
     70 
     71 public:
     72 
     73     DecoratorPhone(Phone *phone): m_phone(phone) {}
     74 
     75     virtual void ShowDecorate() { m_phone->ShowDecorate(); }
     76 
     77 };
     78 
     79 //具体的装饰类
     80 
     81 class DecoratorPhoneA : public DecoratorPhone
     82 
     83 {
     84 
     85 public:
     86 
     87     DecoratorPhoneA(Phone *phone) : DecoratorPhone(phone) {}
     88 
     89     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
     90 
     91 private:
     92 
     93     void AddDecorate() { cout<<"增加挂件"<<endl; } //增加的装饰
     94 
     95 };
     96 
     97 //具体的装饰类
     98 
     99 class DecoratorPhoneB : public DecoratorPhone
    100 
    101 {
    102 
    103 public:
    104 
    105     DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {}
    106 
    107     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
    108 
    109 private:
    110 
    111     void AddDecorate() { cout<<"屏幕贴膜"<<endl; } //增加的装饰
    112 
    113 };
    114 
    115 int _tmain(int argc, _TCHAR* argv[])
    116 {
    117     cout<<"装饰模式"<<endl;
    118 
    119     Phone *iphone = new NokiaPhone("6300");
    120 
    121     Phone *dpa = new DecoratorPhoneA(iphone); //装饰,增加挂件
    122 
    123     Phone *dpb = new DecoratorPhoneB(dpa);    //装饰,屏幕贴膜
    124 
    125     dpb->ShowDecorate();
    126 
    127     delete dpa;
    128 
    129     delete dpb;
    130 
    131     delete iphone;
    132     system("pause");
    133     return 0;
    134 }
  • 相关阅读:
    用node探究http缓存
    静态资源增量更新,转自美团
    前端调试相关
    写完此篇,开始新的征程!
    SSM整合
    SpringMVC
    Mybatis
    设计模式之代理模式
    设计模式之工厂模式
    设计模式之单例模式最佳实现方式
  • 原文地址:https://www.cnblogs.com/wxmwanggood/p/9272529.html
Copyright © 2011-2022 走看看