我需要对我试图解决的编程问题进行设计输入。
问题:
我有旧的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,它也无法设置有效的许可证数组。