Browser 架构

公司产品的一个架构,这个架构是外国总部那边就设计好的,在这边唯一的一次比较大改动是一个牛人引入了HistoryPart结合ViewPager实现了滑动的前进后退。
<1> ProxyBrowserView 在被构造的时候会被传入BrowserManager<既是C 也是 一个 ViewPager>, 一个 ProxiedBrowserView,以及一个
HistoryPart, 如果没有给HistoryPart,那么会new 一个 HistoryPart并且 将此HistoryPart hold的 BrowserView设为此proxiedBrowserView, ProxyBrowserView会维护一个HistoryPart List,在构造时就将传入的HistoryPart加入到维护的HistoryPartList中,有一个commitHistoryPart 会添加输入的HistoryPart到List中, 在animatingToHistoryPart()或者 BrowserManager这个ViewPager的
某个Page被select时,会调用。
ProxyBrowserView某种意义上是BrowserView最外层的接口,
在一个ProxyBrowserView中,因为有一个HistoryPart的list,而每个HistoryPart都对应一个ProxiedBrowserView,那么可以认为
ProxyBrowserView代表了一群ProxiedBrowserView,但是作为一个浏览器,当然任何时候只能有一个proxiedBrowserView可以被显示或者说
作为当前的BrowserView,那么这个ProxiedBrowserView选哪个,以及外界有操作引起ProxiedBrowserView变化,这些逻辑都在ProxyBrowser
View中,ProxyBrowserView为里面的一群ProxiedBrowserView提供了对外被操作和操作的接口,类似于一个中间层, 而因为代表 V 的
BrowserManager也被传入到了此ProxyBrowserView中,因此 ProxyBrowserView可以监视V的变化 和 对 V 进行
操作
这种模式其实说白了就是封装 + 代理模式, 外边的实体 要交互的 对象 只是一个 BrowserView, 至于这个BrowserView当前倒是哪个是什么,不care,因此就有了ProxyBrowserView 代理了 一群被代理 的 ProxiedBrowserView 的 交互。

<2>TabImpl里面也包含了一堆的proxiedBrowserView<纯粹从UI概念上说,因为用户从一个Tab切换到另外一个Tab,当前Tab的所有Webview都会被从ViewPager中remove,重新add 新的Tab的所有HistoryPart里的ProxiedBrowserView>, TabImpl直接和ProxyBrowserView有关联, 在TabImpl内部有一个BrowserViewProxy,里面就有一个ProxyBrowserView的引用,并且还有一个get方法返回里面的ProxyBrowserView引用,如果一个TabImpl里的引用指向的是null,那么会调用browserFragment的createBrowserView()<最后会以BrowserManager作为参数构造一个实例返回>。
TabImpl是为了做Tab切换而专门加的一个类,而TabImpl还对外开放了一个接口来返回其代表的ProxyBrowserView,这样等于像Tab又封装了一下ProxyBrowerView。 因为BroserFragment本身就是一个TabManager,那么操作的直接实体应该是Tab<内部会维护一个Tab的List>。

<3>HistoryPart顾名思义是为了使ProxiedBrowserView能够被以Nav History形式组织起来而对ProxiedBrowserView进行的再封装,
为此,HistoryPart implements了ProxiedBrowserView内部的Delegate接口,意思就是ProxiedBrowserView的一部分逻辑功能被放在History中实现了,所以才是ProxiedBrowserView的Delegate。而HistoryPart中也保存一个指向ProxyBrowserView的引用,已得知当前proxy。
当然的也会维护一个指向ProxiedBrowserView的引用,并且会把自己作为Delegate设置给ProxiedBrowserView

<4>HistoryPart之间的切换也是在ProxyBrowserView中提供的,如果当前ProxyBrowserView所属的Tab是active的,就是当前展示给用户的,
那么会显式的进行ViewPager的setCurrentItem来实现视觉上的从一个HistoryPart的View到另外一个HistoryPart的View的变化,
而如果当前Tab不是active的,那么就不需要在视觉上进行切换<因为当前该Tab的所有HistoryPart的view都不在该Viewpager中>,之需要将该Tab对应的内存中的信息修改一下,会将此HistoryPart加入到ProxyBrowserView所维护的HistoryPartList中,并且会将其currentHistoryPart设为当前切换到的HistoryPart去, 一个是视觉上的切换,一个是后台数据上的切换。

你可能感兴趣的:(Android,Webview,项目经历,Desigin,&,Struct,Android,android)