2017-08-26 68 views
0

獨居工作作爲軟件架構多年來,我很討厭用獨身情況下,我可以避開他們。但不得不爲Android應用程序做一些任務,我遇到的情況是,單例似乎是唯一的選擇。可能有人可以提出其他建議嗎?替代在安卓

的任務是使一個用戶界面嚮導來創建一些新的實體(在我的情況的行程說明)。實體很複雜,需要幾個頁面才能完成其所有數據。

嚮導的組織結構推到後一個後疊一個,因爲用戶進入下一個頁面幾個片段。但是所有片段都應該與編輯實體的一個實例一起工作。當活動重新創建時(旋轉後或其他情況下),此實體應保持活動狀態。如果頁面只有一個,我可以在onSaveInstanceState中保存/恢復實體。但是如果我會在我的嚮導的所有片段中這樣做,那麼所有片段都將保存它自己的實體實例(因爲所有片段都將其保存並恢復)。嚮導將工作錯誤(例如,當您導航回到前面的頁面)。

更多的痛苦,讓我們說,持有該片段應該不知道這個特定的嚮導任何活動,我不會把任何特定代碼,該向導活動。禁用活動也不適用於我的情況。

所以在這種情況下,顯而易見的解決方案是創建一個對我的編輯實體單身。並使所有的嚮導片段與這個單身人士合作。 90%的程序員會毫無疑問地選擇這樣的解決方案。但我的大腦抗議它。爲什麼我應該讓實體單身,當它不是一個單身的性質?

因此,如果有人能提出一些不同的東西,我會非常感激。

+0

在android系統方面「服務」? –

回答

0

假定你有以下:

  • 應用類;
  • WizardManager;
  • SomeWizardDataEntity;

可以在應用類中創建WizardManager與數據實體使用它您的嚮導流程,即:

//BaseFragment: 
WizardManager manager = getApplication().getWizardManager(); 
SomeWizardDataEntity entity = manager.getWizardEntity(); 

//Fragment1: 
entity.addSomeData(); 

//Fragment2: 
entity.addSomeData2(); 

//Fragment3: 
entity.addSomeData3(); 

//Fragment4: 
entity.addSomeData4(); 
manager.wizardFlowFinihed(); 

所以,你將有WizardManager的非單一實例,將活到應用程序類活着。

然後,你可以寫一些測試moking這個實體,即:

@Mock 
WizardManager mWizardManager; 

//start some fragment 

verify(entity, times(1)).addSomeData(); 
verify(manager, times(1)).wizardFlowFinihed();