欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MVC架构的理解

程序员文章站 2024-02-14 15:14:04
...

一.首先需要建立一个基本的Controller的接口,如下面

(1)
public interface IController {
    void onDestroy();
}

(2)

然后再建立一个基本的BaseController去实现这个接口,如下面

public class BaseController<V extends IView> implements IController {

    protected V mView;

    public BaseController(V view) {
        this.mView = view;
    }

    @Override
    public void onDestroy() {
        this.mView = null;
    }//退出时,view是空的
}

在这边,我们会看见一个V的存在,这边是我们第二步所需要用到的一个接口的最初接口  IView ,在这个类的里面我们需要去用protected去定义一个V的变量,并在构造器里面去接收它,这样在后面的具体实现的Controller可以之前调用父类的构造器来实现接收,记得在onDestroy方法中去取消联系

(3)然后就是一个具体的Controller,如下面的类

public class MonitorController extends BaseController<IMonitorView> {


    private List<MonitorMsg> mData = new ArrayList<>();

    public MonitorController(IMonitorView view) {
        super(view);//这个View在父类已经使用了protected来命名了变量
    }

}

在这个类的里面,这个类的构造器就是用来接收下面第二步的回调函数的接口的实例的,我们需要确定好这边需要传入到<>里面的类是什么具体接口的实现类,正常情况下,我们可以在这个去处理一些逻辑的方法,比如我们可以在这个类里面向服务器发起请求数据的请求,然后把数据放入到回调实例的方法中去,这样这个实例方法就会实现它的功能,而这个具体功能是在碎片中去实现的,等下看第三步

二.第二步就是需要使用写一个回调基本的接口,如下面

(1)

public interface IView {
}//没什么功能,只是为了来继承

(2)

然后建立一个基本的接口,在这个类里面去写出需要使用到的回调接口的方法,以后需要使用到的一些功能方法

public interface IMonitorView extends IView {
    void onStationCallback(List<MonitorMsg> data);
}

(3)然后再建立一个抽象类,这个类就是为了在碎片中去建立实例并要求去它实现具体的功能的,如下面

public abstract class MonitorViewImpl implements IMonitorView {

    @Override
    public void onStationCallback(List<MonitorMsg> data) {

    }

总的来说就是我们需要去使用这个接口去定义出某些我们需要使用的功能方法,这些方法需要在在Controller中去使用,使用后实际会回调到碎片中去具体实现功能,也就是说在那个碎片里面有着具体的实现功能

三.建立一个碎片,在这个碎片里面需要有一个Controller的实例,

private MonitorController mMonitorController;

一个有具体实现功能的回调接口的实例,

private MonitorViewImpl monitorCallback = new MonitorViewImpl() {
    @Override
    public void onStationCallback(List<MonitorMsg> data) {
        if (mAdapter != null) {
            mAdapter.setmItems(data);//把从服务器得到的数据加入到adapter中
        }
    }
};

 

在回调里面的方法写上了具体的功能实现(比如在这个方法中我们去把数据,也就是从Controller中获得的数据设置给相对应的adapter)

 

然后在这个碎片里面的onCreate()生命周期中,把那个有具体实现功能的回调接口的实例赋给那个Controller的构造器,

public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mMonitorController = new MonitorController(monitorCallback);
}

 

然后就可以在onCreateView()中去使用那个Controller的实例去调用Controller类里面的方法的

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    if (mView == null) {
        mView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_monitor, container, false);
        mRecyclerView = mView.findViewById(R.id.monitor_list);
        mLayoutManager = new LinearLayoutManager(getContext());
        mAdapter = new MonitorListAdapter();
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);
        mMonitorController.getStationMsg();//使用了控制器去获取数据了
    }
    return mView;
}

这样我们就通过这三者之间的关系来进行了碎片与逻辑与显示的功能的分工合作,这样也很清晰易懂,不过要记得在碎片的onDestroy()中,要去取消

mMonitorController.onDestroy(),这样在碎片消失的时候,Controller的逻辑建立也取消了