我的Android设计模式(二) 观察者模式
2015-09-20 19:38
246 查看
我的Android的设计模式(二) 观察者模式
首先~给大家说一下我对设计模式的认识~当你没有接触到设计模式的时候,你会觉的程序也可以完成,觉的设计模式没有什么必要性,但是当你一旦接触了设计模式,你会发现你的程序可以被设计模式修改的更加健壮,可维护性更强,代码更简洁,这就是设计模式的魅力~希望可以和大家一起学习更多的优秀的设计模式~下面:第二波来咯~首先~何为观察者模式~相信大家都用过微信公众号这个功能,公众号就相当与一个被观察者,而我们就是这个公众号的观察者,当我们去关注一个微信公众号的时候,我们就已经被被观察者“记录在案”,当观察者发生变化,即公众号发布新的消息的时候,被观察者会遍历我们这些观察者,即关注这个公众号的用户,给我们推送最新的消息,我们也可以针对最新的消息去做出相应的反应,这就是观察者模式。那我们可以将这个模式应用在Android的什么地方呢?
当然可应用的范围非常的多,但是最典型的应用还是在广播和广播的接收器上,下面我就给大家演示一下~
需求
现在我需要在一个Activity里发出请求,同时改变多个已启动的Activity和Fragment里面的内容(不要以为这个需求不会有,实际工程中很多地方会出现),我们可以如何实现呢?实现过程
(一)传统模式
首先我们需要我们需要使用的类的内部去编写一个继承自BroadcastReceier的内部类去接收程序传来的广播public class FriendListActivity extends Activity { public class FriendControlReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //当接收到广播时,在此处对外部的Activity或者Fragment进行修改 } } /******省略其余代码********/ }
我们可以看到这种模式是非常的愚蠢和低能的,因为我们需要在多个地方去实现一模一样的代码,这样的程序会有非常多的代码冗余,代码的耦合性也特别的高,所以这种模式只适合一个广播只针对一个地方发送,但是一般这种需求都可以用别的更好的方式取代。
(二) 传统模式改进版
这种方式下我只写一个广播接受类,但是,我在其中实现接口,当有新广播到来时我就调用新的接口,在需要接收广播的Activity或者Fragment里我只需要实例化这个BroadcastReceiver 并实现它的接口,便可以做到接收广播并针对广播内容去实现对应的改变。public class FriendControlReceiver extends BroadcastReceiver { private OnNewBroadcastListener listener = null; public interface OnNewBroadcastListener { void newBroadcast(); } @Override public void onReceive(Context context, Intent intent) { if (listener != null) { listener.newBroadcast(); } } /*************省略其余代码*********************/ }
在Activity内我们只需要这么做
FriendControlReceiver friendControlReceiver = new FriendControlReceiver(); friendControlReceiver.setOnAddFriendListener(new OnNewBroadcastListener() { void newBroadcast() { //编写新广播到来对应的代码 } }); IntentFilter filter = new IntentFilter(); filter.addAction(FriendControlReceiver.RECEIVER_ACTION_CONTROL_FRIEND); registerReceiver(friendControlReceiver, filter);
我们可以看到,这方法相对于传统的方法得到了很大的改进,降低了代码的冗余量,但是代码的冗余量还是很高,且合程度还是较高,比如每当我们需要改变接口或者改变筛选器的值的时候,我们就需要把所有我们实现过的地方都要修改一遍,这也是非常的不符合我们高质量代码的规范的地方,
(三) 观察者模式
重头戏来了,观察者模式来了,首先,我们需要在配置文件中将这个接收器配置一下<receiver android:name=".Receiver.newBrocastReceiver" android:enabled="true" android:exported="false" > <intent-filter android:priority="1000" > <action android:name="***********************************" /> </intent-filter> </receiver>
接着我们实现这个类
public class newBrocastReceiver extends BroadcastReceiver { private static List<OnNewBrocastReceiverListener> listeners = new ArrayList<>(); //保存注册者 public interface OnNewBrocastReceiverListener { void OnNewBrocastReceived(/*这里面可以传递一些想要传递下去的参数*/); } public void onReceive(Context context, Intent intent) { //当有新广播来临时我们遍历观察者,给每个观察者发消息 for (int i = 0; i < listeners.size(); i ++) { listeners.get(i).OnNewBrocastReceived(); } } /** * 注册观察者 */ public static void registListener(OnNewBrocastReceiverListener listener) { //防止重复注册 for (int i = 0; i < listeners .size(); i++) { if (listeners .get(i).equals(item)) { return; } } listeners .add(item); } /** * 取消注册 */ public static void unRegistListeners(Object item) { xygzhReceiverList.remove(item); } }
当看完上面的接收器的代码时你是否已经懂得了我要做的事情的意图了呢?不懂的话再看下面我是如何使用这个接收器的。
/** * 这次以Fragment为例,Activity也是一样的,甚至一些其他的任何类,只要继承了接口 * OnNewBrocastReceiverListener ,都可以这样使用 */ public class TestFragment extends Fragment implements newBrocastReceiver.OnNewBrocastReceiverListener { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //在程序的开始处注册监听 newBrocastReceiver.registListener(this); } @Override public void onDestroy() { //在程序的结束处取消注册 newBrocastReceiver.unRegistListener(this); } /** * 实现接口函数 */ public void OnNewBrocastReceived() { //在此处实现新消息到来时的处理 }
这就是观察者模式实现的方法,我们可以看到,程序中几乎没有冗余的代码,而且程序的耦合度大幅度降低,当你需要改动代码的时候,只需要实现接口,注册,取消注册三个简单的步骤即可完成,这就是设计模式的魅力,当你觉的你的程序混乱不堪难以维护的时候,不如寻找一下有没有合适的设计模式来改变这种现状。
当然观察者模式不一定只可以实现广播和接收,当你理解了观察者模式为什么这样去做的时候,你就可以将其广泛的应用于其他地方了~
观察者模式对我的帮助
在我写工程的时候,我曾经遇到一个好友列表的请求,我的程序入口顺序是,好友列表,聊天界面,好友个人信息,当我在好友个人信息界面删除好友的时候,我需要把聊天界面关闭,在好友列表里删除此人,在三个界面里同时操作,起初我的实现方式是最愚蠢的ActivityResult的方式,一层一层的去执行,当我写完时我发现我的代码变的一团糟,每个不同的页面之间的联系太大,难以维护,于是我果断选择更改实现方式,再不停的总结实现下,最终我设计出了一套适合我的观察者模式,大大改善了我的代码,并且在我的工厂里面多处有类似于这种需求的地方,我都用观察者模式得到了很好的解决。如果大家对这个模式有什么不一样的见解请和我联系~我希望和大家在不停的讨论中完善自己~也希望大家继续关注我~后面还会有我总结的其他模式出现~谢谢~~
相关文章推荐
- openssl for android使用
- Android自定义ViewGroup
- Android中的onActivityResult和setResult方法的使用
- [Android] 高效加载大图、多图解决方案,有效避免程序OOM
- android中dx、dp、dip、sp单位的区别
- Android 4.4(KitKat)中的设计模式-Graphics子系统
- android 上传/下载 图片
- Android中AIDL及其使用
- Android studio使用问题(持续更新)
- Android基础学习之GridView控件
- 探讨Android中的内置浏览器和Chrome
- 录制Android屏幕Gif的方法
- Android PopupWindow使用之地区、学校选择二级联动
- 使用CheckBox
- Android 图片特效处理:drawBitmapMesh——图像扭曲+动感
- Android --固定底部
- Android系统进程优先级排序原因
- Android中正确获得View控件的宽和高——使用篇
- 使用ToggleButton
- Android 动画——Frame Animation与Tween Animation