zoukankan      html  css  js  c++  java
  • C++ 结构型模式

    结构型模式包括:

    1、代理模式:

    (1)Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而           代理一般在交互的过程中(交互前后),进行某些特别的处理。

    (2)适用情况:为其他对象提供一种代理以控制对这个对象的访问。

    2、装饰模式:

    (1)装饰( Decorator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端               就可以有选择地、按顺序地使用装饰功能包装对象。

    (2)适用情况:装饰者模式动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。

    3、适配器模式:

    (1)Adapter模式也叫适配器模式,是构造型模式之一,通过Adapter模式可以改变已有类(或外部类)的接口形式。

    (2)适用情况:是将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一 起工作。

    4、组合模式

    (1)Composite模式也叫组合模式,是构造型的设计模式之一。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。

    (2)适用情况:单个对象和组合对象的使用具有一致性。将对象组合成树形结构以表示“部分--整体”。

    5、桥接模式

    (1)bridge 模式又叫做桥接模式,是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,          从而可以保持各部分的独立性以及应对它们的功能扩展。

    (2)适用情况:桥接模式是将抽象部分与实现部分分离(解耦合),使它们都可以独立的变化。

    6、外观模式

    (1)Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。

    (2)适用情况:为子系统中统一一套接口,让子系统更加容易使用。

    7、享元模式

    (1)Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。

    (2)享元模式的提出:

    (3)适用情况:是以共享的方式,高效的支持大量的细粒度的对象。 

     这里,用代码描述享元模式:

     1 #include<iostream>
     2 #include<map>
     3 using namespace std;
     4  
     5 class Student
     6 {
     7 private:
     8     string name;
     9     int age;
    10     int id;
    11 public:
    12     Student(string n,int a,int i)
    13     {
    14         name = n;
    15         age = a;
    16         id = i;
    17     }
    18     string GetName()
    19     {
    20         return name;
    21     }
    22     int GetAge()
    23     {
    24         return age;
    25     }
    26     int GetId()
    27     {
    28         return id;
    29     }
    30 };
    31  
    32 class FWFactory         //享元模式
    33 {
    34 private:
    35     multimap<int , Student *> *m;                //m为野指针
    36 public:
    37     FWFactory()
    38     {
    39         m = new multimap<int , Student *>;       //给m  new一个对象
    40     }
    41     
    42     ~FWFactory()
    43     {
    44         while(!m->empty())               //若无这步  会造成内存泄漏
    45         {
    46             free(m->begin()->second);    //释放掉value里的具体内容
    47             m->erase(m->begin());        //删掉key的值
    48         }
    49         delete m;                        //释放map
    50     }
    51     
    52     Student *GetPerson(int id)
    53     {
    54         multimap<int , Student *>::iterator it;
    55         
    56         it = m->find(id);
    57         if(it == m->end())
    58         {
    59             string name;
    60             int age;
    61             cout<< "Please input info:" <<endl;
    62             cin>> name  >> age;
    63             
    64             Student *tmp = new Student(name , age , id);
    65             m->insert(make_pair(id , tmp));
    66             
    67             return tmp;
    68         }
    69         else
    70         {
    71             Student *tmp = it->second;
    72             cout<< tmp->GetName() <<" "<< tmp->GetAge() <<" "<< tmp->GetId() <<endl;
    73         }
    74     }
    75 };
    76  
    77 int main()
    78 {
    79     FWFactory *f = new FWFactory;
    80     
    81     f->GetPerson(1);
    82     f->GetPerson(2);
    83     f->GetPerson(3);
    84     f->GetPerson(4);
    85     f->GetPerson(5);
    86     f->GetPerson(6);
    87     f->GetPerson(1);
    88     
    89     delete f;
    90     
    91     return 0;
    92 }
  • 相关阅读:
    《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(下)
    《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)
    Django之REST framework源码分析
    PythonWEB框架之Tornado
    PythonWEB框架之Flask
    Android 外部存储权限分析
    Javaproject集成log4J 1.x
    [Python]通过websocket与jsclient通信
    基于am3358的lcd输出
    SAP 金税接口增强 BADI
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13885002.html
Copyright © 2011-2022 走看看