为旧代码添加额外行为

时间:2017-09-29 16:29:20

标签: c++ visual-studio c++11

我需要对我试图解决的编程问题进行设计输入。

问题:

我有旧的Licensing类和新的Licensing类。我有一个使用旧许可类的应用程序。该应用程序在代码中的任何地方都调用了旧的Licensing类方法。

仔细查看旧的Licensing之后,我意识到将它与新Licensing类分开的唯一内容是它读取的文件类型。旧:读取.ini个文件(普通文本文件),新建:读取.file(二进制)。新的许可工具只读它可以理解的二进制文件。但是我知道,如果有一种方法可以让旧的Licensing类理解.file,那么它就可以避免我在应用程序的任何地方进行操作并执行if (License::Instance().isFeature1Licensed() || NewLicensingTool::Instance.isFeature1Licensed())之类的操作。

要求:

  • 应用必须接受两种类型的文件才能获得许可(.ini)或(.file
  • 旧许可工具必须对新许可工具一无所知,反之亦然

以下是该应用的当前总体布局:

// Singleton
class License
{
public:

.
.
.

   void read (string& filename)
   {
    // read a specific kind (.ini) of file
    // a certain way
   }
.
.
.   
}


// This exists in the app level
// This class requires a lot of
// dependency
class NewLicensingTool
{
public:

.
.
.

   void read (string& filename)
   {
    // reads a specific kind of file (.file)
    // a different way than the old way
   }

   vector<NewLicensingTool::LicensingIDs> getLicenses()

   .
   .
   .
   }


class App
{
  // needs to be able to license the old and
  // new way
  // There are calls to License::Instance() methods
  // everywhere in the code
...
void doSomething()
{
    ...
    if (License::Instance().isFeature1Licensed())
    {
        ...
    }
    ...
}

...

void doAnother()
{
    ..
    if (License::Instance().isFeature2Licensed())
    {

    }
    ..
}
}

以下是我提出的解决方案:

class OtherReadBehavior
{
public:
   void read(string& filename) = 0;
}

// Singleton
class License
{
public:

.
.
.

   void read (string& filename)
   {
    // read a specific kind (.ini) of file
    // a certain way

    OtherReadBehavior::read(filename);
   }
.
.
.   
}


// This exists in the app level
// This class requires a lot of
// dependency
class NewLicensingTool
{
public:

.
.
.

   void read (string& filename)
   {
    // reads a specific kind of file (.file)
    // a different way than the old way
   }

   vector<NewLicensingTool::LicensingIDs> getLicenses()

   .
   .
   .
   }


class App
{
  // needs to be able to license the old and
  // new way
  // There are calls to License::Instance() methods
  // everywhere in the code
class NewLicensingReadBehavior : public OtherReadBehavior
{
public:
   void read(string& filename)
   {
      NewLicensingTool::Instance().read(filename);
   }
}
...
void doSomething()
{
    ...
    if (License::Instance().isFeature1Licensed())
    {
        ...
    }
    ...
}

...

void doAnother()
{
    ..
    if (License::Instance().isFeature2Licensed())
    {

    }
    ..
}
}

我不确定这是一个好的设计还是丑陋的设计。在我向同行介绍之前,我希望得到专家的意见。如果你知道更好的方法或模式我应该抬头。请告诉我。

更新

我只是意识到这个解决方案不起作用,因为旧的License类有一个 私有数组的有效许可证。因此,即使NewLicensingBehavior继承自OtherLicensingBehavior,它也无法设置有效的许可证数组。

0 个答案:

没有答案