【问题标题】:UML Design Pattern and implementation into C++ classesUML 设计模式和 C++ 类的实现
【发布时间】:2020-06-27 05:46:01
【问题描述】:

我正在尝试使用 C++ 学习适配器设计模式 UML,并且在 youtube 的一个视频中显示了此内容 - 我的问题是将 UML 图片转换为 C++ 类/代码:

我真正感到困惑的是:

  1. Clinet -------> [实线] 与接口 Target 的关联。这通常意味着什么我见过实现接口的类,例如实现 Target 的适配器类

  2. 内容适配器与被适配者组成在这里意味着什么 - 如果是容器,那么它是完全还是部分拥有它?

下面是我能想到的代码实现:

class Target
{
public:
 void virtual ServiceA() = 0;
}; 

class Client : public Target
{
public:
Client(){}
void ServiceA() override {}
};

class Adaptee
{
public:
Adaptee(){}
void ServiceX(){}
};

class Adapter : public Target
{
public:
Adapter(){}
void ServiceA() override {adaptee.serviceX();}
Adaptee adaptee;
};

int main()
{
.....
}

我们将如何在 main 中编写代码?请解释一下。

【问题讨论】:

    标签: c++ c++11 design-patterns uml


    【解决方案1】:

    Clinet -------> [实线] 与接口 Target 的关联。这通常意味着什么我见过实现接口的类,例如实现 Target 的适配器类

    不,Client 没有实现/继承Target,所以

    class Client : public Target {
       ...
    };
    

    错了。

    关联可以表明Client有一个类型为Target的属性,即使真正的类型是Adapter,接口Target 用于隐藏适配器。当然 C++ 属性的类型不是Target,而是指向任何管理它的方式的指针。

    但是该关联可以仅用于指示 Client 看到/使用 Target(而不是 Adapter 及其关联的 Adaptee),即使在这种情况下,依赖关系也更好。 Adapter 的实例可以通过类型为 Target * 的参数提供给 Client 的操作是 C++ 或管理指向 Target 的指针的其他方式

    内容适配器与被适配者组成在这里意味着什么 - 如果是容器,那么它是完全还是部分拥有它?

    Adapter 需要一个关联的Adaptee,多重性为 1,但请注意该关联不是组合,因此它不完全拥有它 如果我很明白你的意思。请注意,即使图表中的注释谈到 composed,该关联甚至都不是聚合。

    我们将如何在 main 中编写代码?请解释一下。

    程序可以是:

    #include <iostream>
    
    class Target {
      public:
        virtual void serviceA() = 0;
    };
    
    class Adaptee {
      public:
        void serviceX() { std::cout << "serviceX" << std::endl; }
    };
    
    class Adapter : public Target {
      public:
        Adapter(Adaptee & a) : adaptee(a) {}
        virtual void serviceA() { adaptee.serviceX(); }
      private:
        Adaptee & adaptee;
    };
    
    class Client {
      public:
        void work(Target & t) { t.serviceA(); }
    };
    
    int main()
    {
      Adaptee adaptee;
      Adapter adapter(adaptee);
      Client client;
      
      client.work(adapter);
    }
    

    编译和执行:

    pi@raspberrypi:/tmp $ g++ -Wall c.cc
    pi@raspberrypi:/tmp $ ./a.out
    serviceX
    pi@raspberrypi:/tmp $ 
    

    【讨论】:

    • 非常感谢您的清晰解释
    • @Programmer 欢迎您。适配器模式用于将接口从一个类转换为符合客户端期望的另一个类。适配器允许类在由于接口不兼容而无法协作时进行协作。
    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 2020-01-19
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多