如果设备的连接状态保持不变,我会使用strategy 模式。
您可以有一个接口(策略)“Features”,带有一个“OnlineFeatures”实现和一个“OfflineFeatures”实现,或者您可以将每个单独的功能作为一个启用实现和禁用实现的策略。我通常会选择第 2 种以获得更大的灵活性,但根据应用程序设计的不同,这可能有点过头了。
如果连接状态需要动态更改,您仍然可以使用策略模式,但这取决于您需要在连接状态更改之间维护哪些状态信息。
作为一个例子(在 C++ 中,但我希望这个想法足够清楚):
假设我想要一个具有 2 个可能功能的计算器,能够加法和乘法。我想要一个只做添加的试用版,以及一个同时解锁两个功能的版本。
class IAddStrategy
{
virtual int Add( int first, int second ) = 0;
}
class CAdd: public IAddStrategy
{
virtual int Add( int first, int second ) override { return first + second; }
}
// if I wanted to disable add I could create a CDisabledAdd class
class IMultiplyStrategy
{
virtual int Multiply( int first, int second ) = 0;
}
class CMultiply : public IMultiplyStrategy
{
virtual int Multiply( int first, int second ) override { return first * second };
}
class CDisabledMultiply : public IMultiplyStrategy
{
virtual int Multiply( int first, int second ) override { return 0; }
}
class CCalculator
{
CCalculator( IAddStrategy &add, IMultiplyStrategy &multiply ) : _add(add), _multiply(multiply)
int Add( int first, int second ) { return _add.add(first, second); }
int Multiply( int first, int second ) { return _multiply.multiply(first, second); }
private:
IAddStrategy &_add;
IMultiplyStrategy &_multiply;
}
// You don't necessarily need a factory. If features enabled/disabled status needed to change dynamically, I would need set methods for the strategies on calculator as well.
class CCalculatorFactory
{
CCalculator *CreateTrialCalculator() { return new CCalculator( new CAdd(), new CDisabledMultiply() ); }
CCalculator *CreateCalculator() { return new CCalculator( new CAdd(), new CMultiply() ); }
}
我只是为我的禁用版本返回 0,但您可以实现您的类以提供足够的信息来提供更有用的反馈,或者让实现自己绘制适当的 ui 反馈。