Android MVP模式中,一个Activity对应多个Presenter时该怎样抽象?
阿神
阿神 2017-04-18 09:14:49
0
3
1304

这是网上常见的MvpActivity基类

public abstract class BaseMvpActivity<t extends BaseAdapter> extends AppCompatActivity {   
 
    public T presenter;    
 
     @Override  
     protected void onCreate(Bundle savedInstanceState) {        
         super.onCreate(savedInstanceState);        
         presenter = initPresenter();   
     }    
 
     @Override   
     protected void onResume() {        
          super.onResume();        
          presenter.attach((V)this);    
     }    
 
     @Override   
     protected void onDestroy() {       
        presenter.dettach();        
        super.onDestroy();    
     }   
 
     public abstract T initPresenter();
 
}

这个基类完成了presenter的实例化、presenter持有的Activity对象的释放.
那么当一个Activity有多个功能时,应该怎样实现呢。

我想,一种方法是让一个presenter实现多个功能,这时可以继续用上面的基类,但是程序的功能不容易复用。比如Activity1有功能A和B,Activity2有功能C和D,当Activity3有功能A和D时,无法复用Activity1和2的presenter; 一种方法是一个Activity持有多个presenter,这时就要重写BaseActivity,我写了一个,如下:

public abstract class MvpActivity extends BaseActivity {
    protected Map<String, BasePresenter> presenters;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        presenters = createPresenter();
        super.onCreate(savedInstanceState);
    }

    protected abstract Map<String, BasePresenter> createPresenter();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        for (Map.Entry<String, BasePresenter> entry : presenters.entrySet()) {
            if (entry.getValue() != null) {
                entry.getValue().detachView();
            }
        }
    }

    protected BasePresenter getPresenter(){
        return presenters.entrySet().iterator().next().getValue();
    }

    protected BasePresenter getPresenter(String key){
        return presenters.get(key);
    }
}

但是这个基类使用起来很别扭,说他别扭是因为:
在第一版中有public T presenter这个变量,可以直接调用presenter的功能,第二版中首先要调用getPresenter,还要类型转换才能使用。还有在createPresenter抽象方法实现起来不想第一版那么直观。

我JAVA功力不够,还请各位指点一下。

阿神
阿神

闭关修行中......

全員に返信(3)
PHPzhong

アクティビティはプレゼンター A に対応し、対応するプレゼンター A はプロキシ クラスとしてのみ使用され、他の特定の実装は他のプレゼンター B、C、D によって実装されます。アクティビティを変更する必要はありません。呼び出しメソッドはプレゼンターを再利用することもできますが、奇妙に感じます。 。 。

いいねを押す +0
左手右手慢动作

View と Presenter の間にはプロトコルの制約があります。
既存の V1、P1、V2、P2 があり、ActivityA が P1/P2 の機能に対応すると仮定すると、V1/P2 を実装することも示す必要があります。 V2 インターフェイス。これは、P1 と P2 を実装する PresenterA である必要があります。これは完全な VP プロトコルです。
複数のページが同じ関数を使用する可能性があるため、最も簡単な方法は、ノードで複数の継承を使用することです (1 つの Presenter 実装 ABCD 4)インターフェイス)を使用するため、アクティビティが実際に同じプレゼンターを使用しているかどうかに関係なく、すでに実装されていることがわかっている場合は、上記の方法に従ってプロキシを実装するだけです。

本当に複数のプレゼンターを実装したい場合は、複数の異なるクラスを定義して、異なる複数のプレゼンターの拡張をサポートできます。

リーリー

しかし、これはお勧めできません (抽象化が失われ、依存関係逆転の原則に違反します)。また、配列またはリストを使用することもお勧めできません (基本クラスはコンパイラーのチェックを容易にするためにジェネリックスを使用し、配列またはリストは型指定する必要があります)。特に使用されます)

いいねを押す +0
大家讲道理

http://blog.csdn.net/github_3... に紹介があります

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート