观察者设计模式之推拉模式
推模式:如:用户关注微信号
微信公众号: 多个人去订阅我们的公众
public class WXPublicObservable {
private List<IWXUser> mUsers;
public WXPublicObservable(){
mUsers=new ArrayList<>();
}
/**
* 注册
*/
public void register(IWXUser user){
mUsers.add(user);
}
/**
* 解注册
*/
public void unregister(IWXUser user){
mUsers.remove(user);
}
/**
* 更新文章
*/
public void update(String article){
for (IWXUser user : mUsers) {
user.push(article);
}
}
}
真正公众号
public class WXAdvanceObservable extends WXPublicObservable {
private String article;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
//更新文章
update(article);
}
}
用户接口
public interface IWXUser {
void push(String article);
}
微信用户
public class WXUser implements IWXUser {
private String name;
public WXUser(String name){
this.name=name;
}
@Override
public void push(String article) {
System.out.println(name + " 收到了一篇文章:" + article);
}
}
测试
//被观察者
WXAdvanceObservable wxAdvanceObservable=new WXAdvanceObservable();
//观察者
WXUser user=new WXUser("peakmain");
WXUser user1=new WXUser("喜洋洋");
//注册
wxAdvanceObservable.register(user);
wxAdvanceObservable.register(user1);
//设置文章
wxAdvanceObservable.setArticle("《观察者设计模式-观察数据的插入》");
//解注册
wxAdvanceObservable.unregister(user);
wxAdvanceObservable.setArticle("《rxjava的设计模式》");
拉模式
公众号
public class PullWXPublicObservable {
private List<IWXUser> mUsers;
public PullWXPublicObservable(){
mUsers=new ArrayList<>();
}
/**
* 注册
*/
public void register(IWXUser user){
mUsers.add(user);
}
/**
* 解注册
*/
public void unregister(IWXUser user){
mUsers.remove(user);
}
/**
* 更新文章
*/
public void update(String article){
for (IWXUser user : mUsers) {
user.pull(this);
}
}
}
真正的公众号
public class PullWXAdvanceObservable extends PullWXPublicObservable {
private String article;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
//更新文章
update(article);
}
}
用户接口
public interface IWXUser {
void pull(PullWXPublicObservable observable);
}
WXUser用户
public class WXUser implements IWXUser {
private String name;
public WXUser(String name){
this.name=name;
}
@Override
public void pull(PullWXPublicObservable observable) {
PullWXAdvanceObservable pullWXAdvanceObservable= (PullWXAdvanceObservable) observable;
System.out.println(name+"拉取了一篇文章:"+pullWXAdvanceObservable.getArticle());
}
}
测试
//被观察者
PullWXAdvanceObservable wxAdvanceObservable=new PullWXAdvanceObservable();
//观察者
WXUser user=new WXUser("peakmain");
WXUser user1=new WXUser("喜洋洋");
//注册
wxAdvanceObservable.register(user);
wxAdvanceObservable.register(user1);
//设置文章
wxAdvanceObservable.setArticle("《观察者设计模式-观察数据的插入》");
//解注册
wxAdvanceObservable.unregister(user);
wxAdvanceObservable.setArticle("《rxjava的设计模式》");
java自带的观察者
WXAdvanceObservable:真正的公众号
public class WXAdvanceObservable extends Observable {
private String article;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
//更新文章
setChanged();
notifyObservers(article);
}
}
微信用户:实现拉推模式
public class WXUser implements Observer {
private String name;
public WXUser(String name){
this.name=name;
}
/* @Override
public void push(String article) {
System.out.println(name + " 收到了一篇文章:" + article);
}*/
@Override
public void update(Observable observable, Object o) {
//推送文章
System.out.println(name + " 收到了一篇推送文章:" + o);
//拉取文章
WXAdvanceObservable wxAdvanceObservable= (WXAdvanceObservable) observable;
System.out.println(name + " 主动拉取了一篇文章:" +wxAdvanceObservable.getArticle());
}
}
测试
//被观察者
WXAdvanceObservable wxAdvanceObservable=new WXAdvanceObservable();
//观察者
WXUser user=new WXUser("peakmain");
WXUser user1=new WXUser("喜洋洋");
//注册
wxAdvanceObservable.addObserver(user);
wxAdvanceObservable.addObserver(user1);
//设置文章
wxAdvanceObservable.setArticle("《观察者设计模式-观察数据的插入》");
//解注册
wxAdvanceObservable.deleteObserver(user1);
wxAdvanceObservable.setArticle("《rxjava的设计模式》");
观察数据的插入
Member集合封装类
public class Member {
private String name;
private String age;
public Member(String name,String age){
this.age = age;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
观察者接口
public interface Observer<T> {
void update(T t);
}
MemberObserver:具体的观察者
public abstract class MemberObserver implements Observer<Member> {
}
被观察者
public class Observable<M,T extends Observer<M>> {
private List<T> observables;
public Observable(){
observables=new ArrayList<>();
}
/**
* 注册
*/
public void register(T observer){
observables.add(observer);
}
/**
* 解注册
*/
public void unregister(T observer){
observables.remove(observer);
}
/**
* 更新数据
*/
public void addUpdate(M m){
for (T observable : observables) {
observable.update(m);
}
}
}
数据库
public class DataBaseManager {
private static volatile DataBaseManager mInstance;
private Observable<Member, Observer<Member>> mObservable;
private DataBaseManager() {
mObservable = new Observable<>();
}
public static DataBaseManager getInstance() {
if (mInstance == null) {
synchronized (DataBaseManager.class) {
if (mInstance == null) {
mInstance = new DataBaseManager();
}
}
}
return mInstance;
}
//插入数据
public void insert(Member member){
mObservable.addUpdate(member);
}
public void register(Observer<Member> member) {
mObservable.register(member);
}
public void unregister(Observer<Member> member) {
mObservable.unregister(member);
}
}
InsuranceActivity
public class InsuranceActivity extends AppCompatActivity {
private EditText mNameEt, mAgeEt;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insurance);
mNameEt = (EditText) findViewById(R.id.name_et);
mAgeEt = (EditText) findViewById(R.id.age_et);
}
public void add(View view){
//添加
DataBaseManager.getInstance().insert(new Member(mNameEt.getText().toString(),mAgeEt.getText().toString()));
}
public void finish(View view){
finish();
}
}
MainActivity
public class MainActivity extends AppCompatActivity implements Observer<Member> {
private ListView mMemberLv;
private List<Member> mMembers;
private BaseAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMemberLv = (ListView) findViewById(R.id.member_lv);
mMembers = new ArrayList<>();
setAdapter();
DataBaseManager.getInstance().register(this);
}
private void setAdapter() {
if (mAdapter == null) {
mAdapter = new BaseAdapter() {
@Override
public int getCount() {
return mMembers.size();
}
@Override
public Object getItem(int position) {
return mMembers.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 去掉界面复用优化
TextView nameTv = (TextView) LayoutInflater.from(MainActivity.this).inflate(R.layout.item_lv, parent, false);
nameTv.setText(mMembers.get(position).getName());
return nameTv;
}
};
mMemberLv.setAdapter(mAdapter);
} else {
mAdapter.notifyDataSetChanged();
}
}
public void addMember(View view) {
Intent intent = new Intent(this, InsuranceActivity.class);
startActivity(intent);
}
@Override
public void update(Member member) {
mMembers.add(member);
mAdapter.notifyDataSetChanged();
}
@Override
protected void onDestroy() {
super.onDestroy();
DataBaseManager.getInstance().unregister(this);
}
}