观察者模式是什么?
当一个对象被修改时,则会自动通知依赖它的对象,这种行为的模式就是观察者模式。观察者模式属于行为型模式。
比如,警察在监控坏人,一旦坏人做坏事,警察立马知道并做后续操作,在这个例子中,坏人是被观察者,警察是观察者,坏人做了坏事警察立马就知道了。
我们来写这个小例子
坏人类定义:
package com.sun.module_0_observer;
import java.util.ArrayList;
/**
* 小偷 被观察对象
* 一旦做了坏事,警察会立马知道
*/
public class BadMan {
/**
* 负责监控的警察,观察者对象
*/
private ArrayList<Police> policeMen = new ArrayList<>();
public int badThing = 0;
/**
* 警察开始盯防 观察者加入观察者队列
* @param police
*/
public void attach(Police police) {
policeMen.add(police);
}
/**
* 警察停止盯防 观察者退出观察者队列
* @param police
*/
public void unAttach(Police police) {
policeMen.remove(police);
}
/**
* 触发操作并通知依赖对象
*/
public void doBadThings() {
badThing++;
notifyAllPoliceMen();
}
public String getBadThing() {
return "我干了" + badThing + "件坏事";
}
/**
* 通知观察者
*/
public void notifyAllPoliceMen() {
for (Police policeman : policeMen) {
policeman.catchBadMan(badThing);
}
}
}
警察的抽象类:
package com.sun.module_0_observer;
/**
* 警察部门
*/
public interface Police {
void catchBadMan(int count);
/**
* 大喇叭,用来回调信息给activity
*/
interface Horn {
void speak(String message);
}
}
警察的实现类:
package com.sun.module_0_observer;
public class PoliceMan1 implements Police {
//大喇叭对象,用来回调到页面上
private Horn horn;
public PoliceMan1(Horn horn) {
this.horn = horn;
}
//收到被观察者通知,并用喇叭通知页面,看到结果
@Override
public void catchBadMan(int count) {
horn.speak("我是" + PoliceMan1.class.getSimpleName() + ",我看到坏人干坏事了" + count);
}
}
页面操作,简单演示观察者模式
package com.sun.module_0_observer;
import androidx.appcompat.app.AppCompatActivity;
import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.sun.common_library.arouter.ArouterPath;
@Route(path = ArouterPath.Module_0_observer_MainActivity)
public class MainActivity extends AppCompatActivity {
private BadMan badMan;
private Police police1;
private Police police2;
private Police police3;
private TextView tv_policeman1;
private TextView tv_policeman2;
private TextView tv_policeman3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main0);
tv_policeman1 = this.findViewById(R.id.tv_policeman1);
tv_policeman2 = this.findViewById(R.id.tv_policeman2);
tv_policeman3 = this.findViewById(R.id.tv_policeman3);
badMan = new BadMan();
police1 = new PoliceMan1(new Police.Horn() {
@Override
public void speak(String message) {
tv_policeman1.setText(message);
}
});
police2 = new PoliceMan2(new Police.Horn() {
@Override
public void speak(String message) {
tv_policeman2.setText(message);
}
});
police3 = new PoliceMan3(new Police.Horn() {
@Override
public void speak(String message) {
tv_policeman3.setText(message);
}
});
}
public void doBadClick(View view) {
badMan.doBadThings();
}
public void attach1Click(View view) {
tv_policeman1.setText("派出所1已在监控坏人");
badMan.attach(police1);
}
public void unAttach1Click(View view) {
tv_policeman1.setText("派出所1没有在监控坏人");
badMan.unAttach(police1);
}
public void attach2Click(View view) {
tv_policeman2.setText("派出所2已在监控坏人");
badMan.attach(police2);
}
public void unAttach2Click(View view) {
tv_policeman2.setText("派出所2没有在监控坏人");
badMan.unAttach(police2);
}
public void attach3Click(View view) {
tv_policeman3.setText("派出所3已在监控坏人");
badMan.attach(police3);
}
public void unAttach3Click(View view) {
tv_policeman3.setText("派出所3没有在监控坏人");
badMan.unAttach(police3);
}
}
Jetpack离不开观察者模式,所以先简单铺个垫。
Android-Jetpack代码位置:
github
Jetpack是什么?
官网定义:Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法、减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者可将精力集中于真正重要的编码工作。
下面就是Jetpack的4种类型
![](https://img-blog.csdnimg.cn/3526e6e4e5c74c8496baebc08dbfcde1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2Z6KeC5YuH,size_20,color_FFFFFF,t_70,g_se,x_16)
具体表述见下图
![](https://img-blog.csdnimg.cn/6b7c5ba64ee84d95a6aee1a440d39543.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2Z6KeC5YuH,size_20,color_FFFFFF,t_70,g_se,x_16)
实际开发过程中,我们主要学习架构模块(
Android Archicture Components 安卓架构组件,简称AAC)
AAC的各个库作用到不同的开发模块功能中,每个流程都安排的妥妥的,见下图
![](https://img-blog.csdnimg.cn/754f150238674a4381c70494498f4f4c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2Z6KeC5YuH,size_20,color_FFFFFF,t_70,g_se,x_16)
总结:
Android Jetpack其实并不神秘,就是Google觉得全世界的开发者水平参差不齐,各种架构模式等太乱了,然后他自己推出这些库,希望大家遵循这些最佳做法,尽量把心思放在业务层,实现快速稳健开发,这个大体就是推出Jetpack的愿景。
当然,kotlin和jetpack更配,后续会改为kotlin代码。