1. 程式人生 > >MVP本質上就是一個Proxy靜態代理模式---so easy

MVP本質上就是一個Proxy靜態代理模式---so easy

什麼是MVP?
M就是model資料層,就是承載資料的實體
V就是view介面層,就是展示資料的
P就是Presenter(百度翻譯為提出者; 贈送者)就是從Model中獲取資料並提供給View的層

我們來做一個及其簡單的例子,就是模擬一個插入動作,插入成功,頁面提示Toast插入成功

我們先來具體分析下,這裡面哪些是m層v層p層?
我這個例子為了簡單省事,並沒有具體的p層處理資料的操作,這是虛擬了一個插入成功的結果返回,
p層是做什麼呢?p層就是溝通資料、介面的橋樑,就是我p層去處理資料的增刪改查,然後就提供給v層去展示即可

public boolean insertData
(){ return true; } public void notifyUpdateUI(){ if (activityImpl != null) { if (insertData() == true) activityImpl.showToast("插入成功"); } }

以上就是p層2個簡單的方法,一個是插入動作,插入成功返回一個結果值
然後p層的業務方法到此就做完了?
那問題來了,我們怎麼樣才去通知MainActivity介面去更新ui或者提示使用者Toast顯示插入成功呢?
其實這個就方法太多了,我們可以傳送廣播、EventBus、Handler傳遞都可以

但是呢?廣播太費勁了,先拋開效能不說,就配置,註冊也是不可取的,EventBus?也得需要jar,註冊接受,Handler?其實也可以,呵呵,只不過我們是在做所謂的MVP分層,那麼就用介面把,這個大家肯定都想到了

對!沒錯!我們需要一個介面,對於介面的深刻理解,這裡不在做詳細解釋,因為我也沒有深刻理解介面模式,我只能說自己會用,但是裡面的深刻內涵,我目前無法深刻理解

那我們就來定義一個介面把?介面做什麼呢?就是插入成功後,在P層放入一個介面方法

package com.example.mvpdemo;

public class Presenter {

    ActivityImpl activityImpl;

    public
Presenter(ActivityImpl activityImpl) { super(); this.activityImpl = activityImpl; } public boolean insertData(){ return true; } public void notifyUpdateUI(){ if (activityImpl != null) { if (insertData() == true) { activityImpl.showToast("插入成功"); } } } }

乾脆索性將P層的程式碼,全部貼出來,我們是通過構造器的方式傳入
然後在MainActivity裡面

package com.example.mvpdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements ActivityImpl,
        OnClickListener {

    Button mButton;
    Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.mButton);
        mButton.setOnClickListener(this);
        presenter = new Presenter(this);

    }

    /**
     * p層處理完資料,進行回撥介面實現
     */
    @Override
    public void showToast(String toastMessage) {
        Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT).show();
    }

    /**
     * 點選去彈出toast
     */
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.mButton) {
            presenter.insertData();
            presenter.notifyUpdateUI();
        }
    }
}

showToast方法中進行回撥即可
我們來分析下
MainActivity實現一個ActivityImpl,本質上就是它擁有了一個自己全新定義的一個方法

void showToast(String toastMessage);

然後在P層持有MainActivity類的引用,這裡是用到了多型,不再細細的講解

presenter = new Presenter(this);
ActivityImpl activityImpl;
    public Presenter(ActivityImpl activityImpl) {
        super();
        this.activityImpl = activityImpl;
    }

呼叫p層的notifyUpdateUI方法也就是呼叫了MainActivity的方法
其實可以將P層看作一個代理類

那我們就改改上面的方式,來做進一步的理解;
我們就用一種靜態代理模式來理解這個例子
關於靜態、動態代理去看我下面的文章

我們可以這樣理解,就是讓P層成為一個代理類,然後P層V層,同時實現介面方法,在P層中持有V層的引用,P層插入成功後,呼叫P層的顯示Toast方法,本質上是去呼叫V層的方法
看看我們稍加修改的P層程式碼

package com.example.mvpdemo;

public class Presenter implements ActivityImpl{

    ActivityImpl activityImpl;

    public Presenter(ActivityImpl activityImpl) {
        super();
        this.activityImpl = activityImpl;
    }

    public boolean insertData(){
        return true;
    }

    @Override
    public void showToast(String toastMessage) {
        if (activityImpl != null) {
            activityImpl.showToast(toastMessage);
        }
    }
}

如下是V層程式碼

package com.example.mvpdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements ActivityImpl,
        OnClickListener {

    Button mButton;
    Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.mButton);
        mButton.setOnClickListener(this);
        presenter = new Presenter(this);

    }

    /**
     * p層處理完資料,進行回撥介面實現
     */
    @Override
    public void showToast(String toastMessage) {
        Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT).show();
    }

    /**
     * 點選去彈出toast
     */
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.mButton) {
            boolean insertData = presenter.insertData();
            if (insertData) {
                presenter.showToast("插入成功");
            }
        }
    }
}

這樣做是不是就更體現了MVP的一種靜態代理思想


MVP經典的分層結構程式碼如下:

Model

package com.example.mvpdemo;

public class Model {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Model(String name) {
        super();
        this.name = name;
    }

    public Model() {
        super();
        // TODO Auto-generated constructor stub
    }
}

Presenter

package com.example.mvpdemo;

public class Presenter {

    ActivityImpl activityImpl;

    public Presenter(ActivityImpl activityImpl) {
        super();
        this.activityImpl = activityImpl;
    }

    public boolean insertData(){
        return true;
    }

    public void notifyUpdateUI(){
        if (activityImpl != null) {
            if (insertData() == true) {
                activityImpl.showToast("插入成功");
            }
        }
    }
}

ActivityImpl

package com.example.mvpdemo;
public interface ActivityImpl {
    void showToast(String toastMessage);
}

MainActivity

package com.example.mvpdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements ActivityImpl,
        OnClickListener {

    Button mButton;
    Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.mButton);
        mButton.setOnClickListener(this);
        presenter = new Presenter(this);

    }

    /**
     * p層處理完資料,進行回撥介面實現
     */
    @Override
    public void showToast(String toastMessage) {
        Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT).show();
    }

    /**
     * 點選去彈出toast
     */
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.mButton) {
            presenter.insertData();
            presenter.notifyUpdateUI();

        }
    }
}


代理模式的MVP程式碼如下
Model

package com.example.mvpdemo;

public class Model {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Model(String name) {
        super();
        this.name = name;
    }

    public Model() {
        super();
        // TODO Auto-generated constructor stub
    }
}

Presenter

package com.example.mvpdemo;

public class Presenter implements ActivityImpl{

    ActivityImpl activityImpl;

    public Presenter(ActivityImpl activityImpl) {
        super();
        this.activityImpl = activityImpl;
    }

    public boolean insertData(){
        return true;
    }

    @Override
    public void showToast(String toastMessage) {
        if (activityImpl != null) {
            activityImpl.showToast(toastMessage);
        }
    }
}

ActivityImpl

package com.example.mvpdemo;

public interface ActivityImpl {

    void showToast(String toastMessage);

}

MainActivity

package com.example.mvpdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements ActivityImpl,
        OnClickListener {

    Button mButton;
    Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.mButton);
        mButton.setOnClickListener(this);
        presenter = new Presenter(this);

    }

    /**
     * p層處理完資料,進行回撥介面實現
     */
    @Override
    public void showToast(String toastMessage) {
        Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT).show();
    }

    /**
     * 點選去彈出toast
     */
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.mButton) {
            boolean insertData = presenter.insertData();
            if (insertData) {
                presenter.showToast("插入成功");
            }
        }
    }
}

相關推薦

MVP本質就是一個Proxy靜態代理模式---so easy

什麼是MVP? M就是model資料層,就是承載資料的實體 V就是view介面層,就是展示資料的 P就是Presenter(百度翻譯為提出者; 贈送者)就是從Model中獲取資料並提供給View的層 我們來做一個及其簡單的例子,就是模擬一個插入動作,插入

spring cloud(2) Zuul 智慧路由:路由器和過濾器 本質一個web servlet應用

路由在微服務體系的一個組成部分。例如,/可以對映到您的web應用程式,/api/user對映到使用者服務,並將/api/shop對映到商店服務。 從官方的解釋來看Zuul時Netflix的基於JVM的路由器和服務端負載均衡器 工作原理 1.過濾器機制 zuul的核心是

設計模式靜態代理模式(聚合與繼承方式比較)

rri 技術分享 ktr sta too div ide rup 增加 一、概述 1.目標:要在Tank的move()方法做時間代理及日誌代理(可以設想以後還要增加很多代理處理),且代理間的順序可活更換 2.思路: (1)聚合:代理類聚合了被代理類,且代理類及被代理類都實現

設計思想與模式之四靜態代理模式

test 創建 靜態代理 pan 代理 對象的訪問 override todo 父類 一 概述 1.什麽是代理模式? 為了隱藏與保護目標對象,為其他對象提供一個代理以控制對該目標對象的訪問。 2.什麽是靜態代理模式? 代理模式有兩種: 靜態代理:代理對象固定。 動態代理:

《大話設計模式》——讀後感 (4)為別人做嫁衣?——靜態代理模式(1)

即使 pri 為我 div 結構 apple .cn string 想要 什麽是代理模式: 代理模式結構圖: 直接上代碼: GiveGift接口: package com.sjmx.staticProxy; public interface GiveG

靜態代理模式

準備 ride tro sta 自己的 字節 優缺點 存在 缺點 靜態代理模式 所謂靜態也就是在程序運行前就已經存在代理類的字節碼文件,代理類和委托類的關系在運行前就確定了 舉例理解:以結婚為例,當事人只需要處理自己的主要事兒即可,比如典禮、洞房,其他的雜事兒可以交給代理公

設計模式靜態代理模式

sta 設計 interface 技術分享 face nbsp 圖片 pre his //設計模式之靜態代理模式 interface Chefer { void BecomeChefer(); } //小明想當廚師,天天做好吃的 class XiaoMin

多線程中的靜態代理模式

形式 對比 proxy this 開啟 args rate ted 接口 靜態代理的例子: 1 /** 2 * 1.真實角色 3 * 2.代理角色 4 * 3.共同實現的接口 5 * @author tele 6 * 7 */ 8 public

代理模式靜態代理模式

特點: 兩個子類共同實現一個介面,其中一個子類負責真實的業務實現,另外一個子類完成輔助真實業務主題的操作。 interface ISubject { public void buyLipstick();// 核心功能是買口紅 } class RelSubject imple

_083_Java_interface的靜態代理模式

----------------------------------- package org.lfz._11_04_StaticProxyPattern; public class TestProxy { public static void main(Str

(轉)動態代理模式靜態代理模式區別,動態代理底層實現原理

靜態代理 靜態代理在使用時,需要定義介面或者父類,被代理物件與代理物件一起實現相同的介面或者是繼承相同父類,程式碼如下 程式碼示例: 介面:IPersonDao.java public interface IPersonDao { void update();

28--靜態代理模式和JDK、CGLIB動態代理

在分析AOP的原始碼之前,我們需要了解一下代理模式,代理模式可分為靜態代理和動態代理兩種。 1.靜態代理 代理模式是常用設計模式的一種,我們在軟體設計時常用的代理一般是指靜態代理,也就是在程式碼中顯式指定的代理。 靜態代理由 業務實現類、業務代理類 兩部分組成。

Java設計模式靜態代理模式(裝飾著模式

靜態代理模式與裝飾著模式本質上是有區別的,但是具體的區別以後再說,大體上還是有很多共同點的,裝飾著模式本質是不對原有物件或者方法改變而增強程式或者方法的功能,實現的是無侵入式程式設計。 實現要求: 1.被裝飾類與裝飾類實現同一個介面 目的式是實現無侵入式變成 2.裝飾類必須持有原

java 靜態代理模式

  代理模式:為其他物件提供一種代理以控制對這個物件的訪問。說白了就是"真實物件"的代表,在訪問物件時引入一定程度的間接性,因為這種間接性可以附加多種用途。    代理,可以理解為 我們生活中的代購、律

27--靜態代理模式和JDK、CGLIB動態代理

前面的章節,已經分析了IoC容器的原始碼,接下來的章節來分析Spring的另一個核心功能AOP。為了更好的分析原始碼,需要先溫習一下動態代理的知識,如果對java的動態代理無所瞭解的話,那麼對AOP原始碼的分析就無從談起。代理模式可分為靜態代理和動態代理兩種。而

JDK的Proxy動態代理模式和CGLIB動態代理模式的區別和共同點

首先我們來談談聯眾代理模式的不同之處:《1》代理類不同點:(1)Proxy的代理類的建立是通過工具類或者工廠類自動建立的,   我們只需要呼叫Proxy.newProxyInstance(Loader,interfaces,h);正確的傳入相應的引數,就可以得到餓哦們想要的目

設計模式_靜態代理模式

設計 構圖 proxy 代理 bubuko com pub rgs implement 模式:行為型模式 ? 架構圖 ? 代碼 接口 public interface Image { public void display(); } Image 實現 public

靜態代理模式學習

時間 str 測試類 interrupt string lee 對象 exc ati 靜態代理模式 代理模式(Proxy):為其他對象提供一種代理以控制對這個對象的訪問。代理模式說白了就是“簡單對象的 代表”,在訪問對象時引入一定程度的間接性,因為這種間接性可以附加很多用途

java的執行緒、建立執行緒的 3 種方式、靜態代理模式、Lambda表示式簡化執行緒

# 0、介紹 **執行緒**:多個任務同時進行,看似多工同時進行,但實際上一個時間點上我們大腦還是隻在做一件事情。程式也是如此,除非多核cpu,不然一個cpu裡,在一個時間點裡還是隻在做一件事,不過速度很快的切換,造成同時進行的錯覺。 **多執行緒**: 方法間呼叫:普通方法呼叫,從哪裡來到哪裡

矩陣轉置-陣列調換順序可以完成的活,so easy

7:矩陣轉置 檢視 提交 統計 提問 總時間限制: 1000ms 記憶體限制: 65536kB 描述 輸入一個n行m列的矩陣A,輸出它的轉置AT。 輸入 第一行包含兩個整數n和m,表示矩陣A的行數和列數。1 <= n <= 100,1 <= m <= 1