1.Android下的容器之间的联动?
场景:有三个模块,标题容器Title,中间容器内容Middle(FrameLayout),底部容器导航Bottom,如何实现A,C随着B的变化而变化?
思路:如果能够区分当前正在显示的界面是哪个,那问题不就解决了?
方法一:字节码class判断
在执行ChangeTitleAndBottom()方法时,见名知意,该方法是用来切换Title和Bottom容器里面的页面内容,
如果能获取到当前Middle中页面的class文件,不就可以哦了,图中currentUI为当前Middle中正在显示的页面。伪代码如下:
上述代码貌似就解决了问题,但是如果在团队开发中,就会有问题,因为,这样做的前提是,项目在刚开始的时候就要将所有页面的内容名称给定下来。,所以,我们可以想出另外一种方式,给每个界面绑定一个唯一的标识,根据标识来区分当前所显示的界面。
方法二:唯一标识,switch判断
这样做还是 存在问题:
1、当界面过多的时候,需要在中间容器中使用大量篇幅的代码去处理标题和底部
2、如果项目中有其他的容器(如:左右菜单容器)与中间容器联动, 需要在中间容器中使用大量篇幅的代码
去处理左右两个菜单
那么问题来了,开发中到底该如何解决这种问题呢?仔细观察代码,我们不难发现出现这种问题的根本原因,就是代码的耦合度太高了,那么,降低耦合度不就解决了吗?这时,我们可以通过观察者模式来搞定它。
方法三:唯一标识+观察者模式
思路; 我们可以将中间容器视为被观察者,顶部标题栏Title和底部导航栏Bottom设为观察者,将观察者存放到一个有序集合中ArrayList<Observer>。
具体实现步骤:
操作步骤:
1、将中间容器Middle变成被观察的对象,作为Observable子类,使用观察者集合
2、将标题和底部容器变成观察者,作为Observer<I>实现类
3、将标题和底部容器添加到观察者集合中
4、当中间容器变动了调用(super.setChanged()),通知(super.notifyObservers(Object data))观察者更新内容, 循环遍历观察者集合
5、所有的观察者处理update方法
代码如下:
被观察者Middle中:
:
观察者(例如:Title)中代码
这样做的好处是,以后如果需求更改了,被观察者中的代码完全不需要改动,需要更改的只是观察者集合中的元素。