字节-Android开发面经(四)

扶摇就业

共 2839字,需浏览 6分钟

 ·

2021-06-02 05:21

点击蓝字关注我们,获取更多面经








MVC、MVP区别




过对比图我们分析一下两种模式的特点:


MVC

View:布局的xml文件,或者纯Java写的布局,可以把页面显示的逻辑直接放在View中。

Model:数据处理层,可以直接和View进行交互。

Controller:把特定的功能逻辑抽离出来,作为控制层,保证View层和Model层的功能单一性,便于维护。

MVC模式相对比较简单,尤其是View层,我们可以通过jsp等技术直接操作页面,完成和Controlller层和Model层的交互,所以MVC的核心是在View层。


接下来我们再看看MVP模式:

MVP

View:Activity作为显示层。

Presenter:逻辑层,从Activity中抽离出功能逻辑,简化Activity的代码。

Model:数据处理层,主要负责网络请求,本地数据加载等操作,进一步简化Activity的代码。


从MVP的构成来看,Presenter和Model都是为了View层存在的,所以MVP的核心仍然是View层。


MVP的演变

刚才我们分析了MVC和MVP的构成,我们发现MVP模式相比MVC模式要复杂:

MVC的View层和Model层本身就是分离的,Controller层主要是简化View层的逻辑代码。

MVP的Presenter层和Model层都是为了拆分View层而存在的。


Activity在Android开发中扮演者重要的角色,页面显示,数据加载,各种事件,他一个人可以承担所有相关的功能。虽然通过xml方便了布局的开发,但是在与后端开发中的xml相比,他并没有承担起显示UI的责任,所以Activity变得越来越庞大,轻轻松松就可以几千行代码,非常不利于维护,为了让View层单纯的负责UI的显示,把Activity中的功能逻辑抽离出来,命名为Presenter层,把数据相关的操作(接口,本地数据库等)提取成Model层,并且直接把View层和Model层通过Presenter层解耦,进一步简化Activity的代码,防止Activity体积过大。


MVC和MVP的区别

这里主要说他们的不同点:

1、Presenter与Controller都扮演了逻辑层的角色,但是Presenter层的功能相对更复杂,因为他负责和View的双向交互,Controller只是单向的中介。因为Presenter是从View层抽离出来的,通常和View是一对一的关系,而Controller是面向业务的,往往是单例模式或者提供静态方法。

2、MVP中View和Model是不能进行通信的,虽然加重了P层的负担,但是有利于维护View层和Model层,如果条件允许,我们还可以对Presenter进一步拆分,来弥补Presenter负担过重的问题。

3、MVC中View和Model层可以直接交互,虽然方便了两者之间的交互,但是耦合性相对较高。








udp和tcp的区别




TCP是基于连接的,可靠的,偏向于传输大量数据,速度慢,http,ftp,smtp,telnet使用了tcp;

UDP是无连接的,不可靠的,偏向于传输少量数据,速度快,dns,tftp,rip,snmp,rtp,nfs等使用了udp。 






约瑟夫环




约瑟夫环

问题描述:

m个人围成一个圈,指定一个数字n,从第一个人开始报数,每轮报到n的选手出局,由下一个人接着从头开始报,最后一个人是赢家。其中m>1,n>2。

利用链表,然后构建一个循环结构,正好是环,最后计算出结果。


    遍历环形链表会是一个无限循环,如果链表中的数据逐渐减少,不控制终究会一个不剩,这又不满足我们问题的求解,因此我们需要定义出循环结束的条件,按照约瑟夫环的规则,只剩下一个的时候就结束,在环形链表结构中,那就是结点本身的下一个节点就是它自己。这样就可以结束遍历了。最后打印出剩下的结点,问题解决。

//约瑟夫环问题的起源来自犹太历史学家约瑟夫和他的朋友以及39其余的犹太人,总共41人为了躲避敌人,藏在一个山洞中,//39个犹太人决定宁愿死也不被敌人抓到,于是决定自杀,所有人排成一个圈,由第一个人开始报数,每当数到3,就自杀。//这个游戏接着从自杀的位置开始,还是从1数到3。依次类推,约瑟夫将朋友和自己安排在了16和31的位置,最后顺利逃过了//自杀这一劫,因为最后就剩他一个人了。public class JosefCircleMain {  public static void count(int n){//数到3出局,中间间隔两个人int k = 3;//头结点不存储数据Node head = new Node();Node cur = head;//循环构造这个链表for(int i=1;i<=n;i++){Node node = new Node(i);cur.next = node;cur = node;}//链表有数据的部分首尾相连形成一个环。cur.next = head.next;//统计开始的时候,刨去头结点,然后从第一个有数据的结点开始报数Node p = head.next;//循环退出的条件是最后只剩一个结点,也就是这个结点的下一个结点是它本身while(p.next!=p){//正常报数的遍历逻辑for(int i=1;i<k-1;i++){p = p.next;}//当数到3的时候,出局System.out.print(p.next.data+"->");p.next = p.next.next;p = p.next;}//最后剩下的一个结点System.out.println("(left:"+p.data+")");} public static void main(String[] args) {//以4个人为例,1234 : 最先出局的是3,然后剩下412,接着2出局,剩下41,这时候就是4出局,最后剩下1.count(4);//41个人为例,就是约瑟夫环的本身了,最后剩下的是31count(41);} } class Node{  int data;  Node next;  public Node(){}  public Node(int data){this.data = data;}}









更多面经





阿里-Android开发面经(一)


百度-Android开发面经(一)


滴滴-Android开发面经(一)


    扫描二维码

   获取更多面经

  扶摇就业  


浏览 38
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报