• 【结构型】Adapter模式


        Adapter模式主要意图是将类或接口转换成客户期望的接口,从而使得原本不兼容、无法在一起工作的接口可以在一起工作。该模式有两种形式的Adapter法,一是继承方式;二是对象关联依赖方式。

        继承方式Adapter法,相比之下,耦合性更强些,并且毕竟依赖于静态继承,如果被适配的对象有多个(派生)版本的话,则在运行时,将无法做到动态适配,因此,如果想要切换适配对象,就必需要重新编译链接。该方式的类关系参考如下:

        就Adapter的目的来说,Adapter对象在使用目的上与被适配的Adaptee对象本质上是没有什么关系的,因此可以说Adapter对象并不是一个Adaptee对象,Adapter对象仅仅只是需要Adaptee对象的相关功能而已(可以直观理解为:借个道,从你这路过而已)。继承方式的Adapter的编码结构参考如下:

     1 namespace adapter
     2 {
     3     class Target
     4     {
     5     public:
     6         virtual void doSomething() {};
     7         // some code here........(like virtual destructor etc.)
     8 
     9     };//class Target
    10 
    11     class Adaptee
    12     {
    13     public:
    14         void doSpecifyWork() { /* some code here........ */ }
    15 
    16     };//class Adaptee
    17 
    18     class Adapter : public Target
    19                   , private Adaptee
    20     {
    21     public:
    22         virtual void doSomething() override { Adaptee::doSpecifyWork(); }
    23 
    24     }//class Adapter
    25 
    26 }//namespace adapter
    类继承式的Adapter编码结构参考

        前面已述继承式的Adapter相对灵活性不强,而且最重要的问题是耦合性变强了,只要被适配对象有变动就需要重新编译链接。对象关联依赖方式相比继承方式更为灵活,并且可以在运行时对于同一系列的Adaptee进行动态适配。就设计而言,我们总是希望优先使用组合方式而非继承。因此,对于Adapter,建议优先考虑关联依赖式。类关系图参考如下:

        模式编码结构参考如下:

     1 namespace adapter
     2 {
     3     class Target
     4     {
     5     public:
     6         virtual void doSomething() {};
     7         // some code here........(like virtual destructor etc.)
     8 
     9     };//class Target
    10 
    11     class Adaptee
    12     {
    13     public:
    14         void doSpecifyWork() { /* some code here........ */ }
    15 
    16     };//class Adaptee
    17 
    18     class Adapter : public Target
    19     {
    20     public:
    21         virtual void doSomething() override {
    22             auto pAdaptee = this->getAdaptee();
    23             if (nullptr != pAdaptee) {
    24                 pAdaptee->doSpecifyWork();
    25             }
    26             // some code here........
    27         }
    28         // some code here........
    29 
    30     private:
    31         Adaptee*    getAdaptee() { return m_pAdaptee; }
    32 
    33     private:
    34         Adaptee*    m_pAdaptee;
    35 
    36     }//class Adapter
    37 
    38 }//namespace adapter
    关联依赖式Adapter编码结构参考

        实际上,Adapter可以提高代码的复用性,可以让多个互不相干的功能模块协同工作。但是Adapter时的难易程度与必要性,有时候也是需要斟酌的。如:待适配的以象极期复杂,而且与期望的对象相似度极低,此时,Adapter就比较蛋碎,肯定会花费不少时间与功夫,此时就需要进一步考虑是否真的有这个必要去适配。即:我们在动手前,需要先分析下Adapter的代价。这个算是一个注意点吧。

  • 相关阅读:
    「国庆训练」Bomb(HDU-5934)
    「题目代码」P1049~P1053(Java)
    「日常训练」Case of Matryoshkas(Codeforces Round #310 Div. 2 C)
    「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
    「专题训练」Air Raid(HDU-1151)
    「专题训练」Machine Schedule(HDU-1150)
    「日常训练」Girls and Boys(HDU-1068)
    「Python」conda与pip升级所有的包
    「赛后补题」Meeting(HDU-5521)
    通过button将form表单的数据提交到action层
  • 原文地址:https://www.cnblogs.com/tongy0/p/5524611.html
Copyright © 2020-2023  润新知