所以基本上如果设备有互联网,则允许发生某些操作如果没有互联网,则不允许运行某些操作。
在线模式和离线模式。
有哪些方法可以构建这种类型的情况,可以使用哪些模式?
想到的明显是一个标志作为条件和一个 if else 语句来处理代码选择。
online = true
getconnection()
if {!getconnection){
online = false
}
if (online) {
do everything online
}else {
do only offline stuff
}
如果已经有一个现有的代码库需要考虑此逻辑,那么针对这种情况的最佳补救措施是什么?
如果设备的连接状态保持静态,我将使用策略模式。
您可以有一个界面(策略)"功能",其中包含"在线功能"实现和"离线功能"嵌入,或者您可以将每个单独的功能作为具有启用实现和禁用实现的策略。我通常会选择第二个以获得更大的灵活性,但根据应用程序设计,这可能会矫枉过正。
如果连接状态需要动态更改,您仍然可以使用策略模式,但这取决于您需要在连接状态更改之间维护哪些状态信息。
举个例子(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 反馈。
也许这段代码会有所帮助:
if (CheckNetworkStatus.getInstance(context).isOnline()) {
//do online stuff
} else {
//do offline stuff
}