一切皆物件,介面也能再抽象(Fragment通訊)

Abels發表於2017-10-19

先看效果圖

1.什麼是介面

介面:一種方法與實現分離的結構化的方法
一種完全解耦的方法,也是實現java語言多繼承的方法

2.為什麼要在抽象介面

Fragment的通訊

3.為什麼使用Fragment

Fragment是在android2.3誕生
優點:

  • 1.速度快(出現就是為了解決Activity速度慢)
  • 2.方便管理(fragmentManager複用很高)
  • 3.耦合度低**

    4.Activity與Fragment的通訊

    1> Handler通訊方式
    優點:
  • 解決問題,實現通訊
    缺點:
  • 1.高耦合(持有物件)
  • 2.無法從Activity獲取到返回值
  • 3.記憶體洩漏

2> 廣播方式通訊
優點:

  • 1.能夠解決問題
  • 2.耦合度低
    缺點:
  • 1.效能差
  • 2.目標不明確
  • 3.程式碼冗餘
    3> EventBus
    優點:
  • 1.簡單
  • 2.方便 打哪指哪
    缺點:
  • 1.效能差,大量用到了反射,卡頓
  • 2.程式碼很難維護(不需要知道程式碼的邏輯 需要自己看底層原始碼)
  • 3.資料只能單向傳遞
    4> 介面
    優點:
  • 1.簡單
  • 2.效率高
  • 3.解耦合
    缺點:
  • 如果專案中大量使用介面多得話就不是很好了(命名也會很麻煩)所以需要萬能Interface

    5.介面抽象

  • 介面的組成:
    1.介面名 2.函式(函式名 返回值==>可變 引數==>可變) 3.空的函式體
    函式分為4種:

  • 有引數無返回值
  • 有引數有返回值
  • 無返回值有引數
  • 無引數無返回值

    6.程式碼

    1.定義Function
package com.zhang.yu.struct;

/**
 * Created by zhang_shuai on 2017/10/18.
 * Del:抽取介面中共有部分 函式名
 */

public abstract class Function {

    public String mFunctionName;
    public Function(String name){
        this.mFunctionName = name;
    }
}複製程式碼

2.無參無返回值

package com.zhang.yu.struct;

/**
 * Created by zhang_shuai on 2017/10/18.
 * Del:無參無返回值
 */

public abstract class FunctionNoParamNoResult extends Function {

    public FunctionNoParamNoResult(String name) {
        super(name);
    }

    public abstract void function();//無參無返回值
}複製程式碼

2.有返回值有引數

package com.zhang.yu.struct;

/**
 * Created by zhang_shuai on 2017/10/18.
 * Del:有返回值有引數
 */

public abstract class FunctionAndParamNoResult<Param> extends Function {
    public FunctionAndParamNoResult(String name) {
        super(name);
    }

    public abstract String function(Param data);
}複製程式碼

3.無引數有返回值

package com.zhang.yu.struct;

/**
 * Created by zhang_shuai on 2017/10/18.
 * Del:無引數有返回值
 */

public abstract class FunctionNoParamAndResult<Result> extends Function {
    public FunctionNoParamAndResult(String name) {
        super(name);
    }

    public abstract Result function();
}複製程式碼

4.無參無返回值

package com.zhang.yu.struct;

/**
 * Created by zhang_shuai on 2017/10/18.
 * Del:無參無返回值
 */

public abstract class FunctionNoParamNoResult extends Function {

    public FunctionNoParamNoResult(String name) {
        super(name);
    }

    public abstract void function();//無參無返回值
}複製程式碼

5.FunctionManager用於管理四中情況

package com.zhang.yu.struct;

import android.text.TextUtils;

import java.util.HashMap;

/**
 * Created by zhang_shuai on 2017/10/18.
 * Del:管理類
 */

public class FunctionManager {
    private static final FunctionManager ourInstance = new FunctionManager();

    public static FunctionManager getInstance() {
        return ourInstance;
    }

    private FunctionManager() {
        mFunctionNoParamNoResultHashMap = new HashMap<>();
        mFunctionNoParamAndResultHashMap = new HashMap<>();
        mFunctionAndParamAndResultHashMap = new HashMap<>();
        mFunctionAndParamNoResultHashMap = new HashMap<>();
    }
    //無引數無返回值
    private HashMap<String,FunctionNoParamNoResult> mFunctionNoParamNoResultHashMap;
    //無引數有返回值
    private HashMap<String,FunctionNoParamAndResult> mFunctionNoParamAndResultHashMap;
    //有引數有返回值
    private HashMap<String,FunctionAndParamAndResult> mFunctionAndParamAndResultHashMap;
    //有引數無返回值
    private HashMap<String,FunctionAndParamNoResult> mFunctionAndParamNoResultHashMap;

    //新增介面
    public FunctionManager addFunction(FunctionNoParamNoResult function){
        mFunctionNoParamNoResultHashMap.put(function.mFunctionName,function);
        return this;
    }

    //執行介面
    public void invokeFunction(String functionName){
        if(TextUtils.isEmpty(functionName)){
            return;
        }
        if(mFunctionNoParamNoResultHashMap != null){
            FunctionNoParamNoResult f = mFunctionNoParamNoResultHashMap.get(functionName);
            if(f != null){
                f.function();
            }
            if(f == null){
                try {
                    throw new FunctionException("NO Function  :  "+functionName);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //新增介面
    public FunctionManager addFunction(FunctionNoParamAndResult function){
        mFunctionNoParamAndResultHashMap.put(function.mFunctionName,function);
        return this;
    }

    //執行介面
    public <Result> Result invokeFunction(String functionName,Class<Result>  c){
        if(TextUtils.isEmpty(functionName)){
            return null;
        }
        if(mFunctionNoParamAndResultHashMap != null){
            FunctionNoParamAndResult f = mFunctionNoParamAndResultHashMap.get(functionName);
            if(f != null){
                if(c!=null){
                    return c.cast(f.function());
                }else{
                    return (Result) f.function();
                }
            }
            if(f == null){
                try {
                    throw new FunctionException("NO Function  :  "+functionName);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    //新增介面
    public FunctionManager addFunction(FunctionAndParamNoResult function){
        mFunctionAndParamNoResultHashMap.put(function.mFunctionName,function);
        return this;
    }

    //執行介面
    public <Param> Param invokeFunction(String functionName,String  str){
        if(TextUtils.isEmpty(functionName)){
            return null;
        }
        if(mFunctionAndParamNoResultHashMap != null){
            FunctionAndParamNoResult f = mFunctionAndParamNoResultHashMap.get(functionName);
            if(f != null){
                if(str!=null) {
                    return (Param) f.function(str);
                }
            }
            if(f == null){
                try {
                    throw new FunctionException("NO Function  :  "+functionName);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}複製程式碼

6.FunctionException自定義異常

package com.zhang.yu.struct;

/**
 * Created by zhang_shuai on 2017/10/18.
 * Del:
 */

public class FunctionException extends Exception {
    public FunctionException(String s){
        super(s);
    }
}複製程式碼

7.BaseFragment用於繫結介面

package com.zhang.yu;

import android.content.Context;
import android.support.v4.app.Fragment;

/**
 * Created by zhang_shuai on 2017/10/18.
 * Del:
 */

public class BaseFragment extends Fragment {

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        //繫結介面
        if(context instanceof MainActivity){
            ((MainActivity)context).setFunction();
        }
    }
}複製程式碼

8.Fragment1

package com.zhang.yu;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.zhang.yu.struct.FunctionManager;

/**
 * Created by zhang_shuai on 2017/10/18.
 * Del:
 */

public class Fragment1 extends BaseFragment {

    //定義介面
    public static final String INTRFACE = Fragment1.class.getName()+"NPNR";


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_message, container, false);
        view.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FunctionManager.getInstance().invokeFunction(INTRFACE);//使用介面
            }
        });
        return view;
    }

}複製程式碼

9.MainActivity使用

//建立介面
    public void setFunction(){
        FunctionManager functionManager = FunctionManager.getInstance();

            functionManager.addFunction(new FunctionNoParamNoResult(Fragment1.INTRFACE) {
                @Override
                public void function() {
                    Toast.makeText(MainActivity.this,"無參無返回值的介面",Toast.LENGTH_SHORT).show();
                }
            });

           functionManager.addFunction( new FunctionNoParamAndResult<String>(Fragment2.INTRFACE){

               @Override
               public String function() {

                   return "我是介面   有返回值 無參的2";
               }
           });

        functionManager.addFunction(new FunctionAndParamNoResult(Fragment3.INTRFACE) {
            @Override
            public String function(Object data) {
                return "我是介面   有返回值  有參的3" +data;
            }
        });


    }複製程式碼

總結

1.用到this排程
2.主要設計思想
3.一句話定義介面 繫結介面 呼叫介面

專案地址:github.com/fengyutongx…

相關文章