Push-pull mode of observer design mode
Push mode: for example, user pays attention to micro signal
WeChat official account: many people subscribe to our public.
public class WXPublicObservable {
private List<IWXUser> mUsers;
public WXPublicObservable(){
mUsers=new ArrayList<>();
}
/**
* register
*/
public void register(IWXUser user){
mUsers.add(user);
}
/**
* Solution registration
*/
public void unregister(IWXUser user){
mUsers.remove(user);
}
/**
* Update articles
*/
public void update(String article){
for (IWXUser user : mUsers) {
user.push(article);
}
}
}
True official account
public class WXAdvanceObservable extends WXPublicObservable {
private String article;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
//Update articles
update(article);
}
}
User interface
public interface IWXUser {
void push(String article);
}
WeChat users
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 + " An article was received:" + article);
}
}
test
//Observed
WXAdvanceObservable wxAdvanceObservable=new WXAdvanceObservable();
//Observer
WXUser user=new WXUser("peakmain");
WXUser user1=new WXUser("Beaming with Joy");
//register
wxAdvanceObservable.register(user);
wxAdvanceObservable.register(user1);
//Set article
wxAdvanceObservable.setArticle("<Observer design pattern-Insertion of observation data");
//Solution registration
wxAdvanceObservable.unregister(user);
wxAdvanceObservable.setArticle("<rxjava Design mode of");
Pull mode
official account
public class PullWXPublicObservable {
private List<IWXUser> mUsers;
public PullWXPublicObservable(){
mUsers=new ArrayList<>();
}
/**
* register
*/
public void register(IWXUser user){
mUsers.add(user);
}
/**
* Solution registration
*/
public void unregister(IWXUser user){
mUsers.remove(user);
}
/**
* Update articles
*/
public void update(String article){
for (IWXUser user : mUsers) {
user.pull(this);
}
}
}
True official account
public class PullWXAdvanceObservable extends PullWXPublicObservable {
private String article;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
//Update articles
update(article);
}
}
User interface
public interface IWXUser {
void pull(PullWXPublicObservable observable);
}
WXUser users
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+"Took an article:"+pullWXAdvanceObservable.getArticle());
}
}
test
//Observed
PullWXAdvanceObservable wxAdvanceObservable=new PullWXAdvanceObservable();
//Observer
WXUser user=new WXUser("peakmain");
WXUser user1=new WXUser("Beaming with Joy");
//register
wxAdvanceObservable.register(user);
wxAdvanceObservable.register(user1);
//Set article
wxAdvanceObservable.setArticle("<Observer design pattern-Insertion of observation data");
//Solution registration
wxAdvanceObservable.unregister(user);
wxAdvanceObservable.setArticle("<rxjava Design mode of");
java's own observer
WXAdvanceObservable: the real official account.
public class WXAdvanceObservable extends Observable {
private String article;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
//Update articles
setChanged();
notifyObservers(article);
}
}
Wechat users: pull and push mode
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 + " Received an article: "+ article";
}*/
@Override
public void update(Observable observable, Object o) {
//Push articles
System.out.println(name + " Received a tweet:" + o);
//Draw articles
WXAdvanceObservable wxAdvanceObservable= (WXAdvanceObservable) observable;
System.out.println(name + " Took the initiative to pull an article:" +wxAdvanceObservable.getArticle());
}
}
test
//Observed
WXAdvanceObservable wxAdvanceObservable=new WXAdvanceObservable();
//Observer
WXUser user=new WXUser("peakmain");
WXUser user1=new WXUser("Beaming with Joy");
//register
wxAdvanceObservable.addObserver(user);
wxAdvanceObservable.addObserver(user1);
//Set article
wxAdvanceObservable.setArticle("<Observer design pattern-Insertion of observation data");
//Solution registration
wxAdvanceObservable.deleteObserver(user1);
wxAdvanceObservable.setArticle("<rxjava Design mode of");
Insertion of observation data
Member collection encapsulation class
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;
}
}
Observer interface
public interface Observer<T> {
void update(T t);
}
MemberObserver: specific observer
public abstract class MemberObserver implements Observer<Member> {
}
Observed
public class Observable<M,T extends Observer<M>> {
private List<T> observables;
public Observable(){
observables=new ArrayList<>();
}
/**
* register
*/
public void register(T observer){
observables.add(observer);
}
/**
* Solution registration
*/
public void unregister(T observer){
observables.remove(observer);
}
/**
* Update data
*/
public void addUpdate(M m){
for (T observable : observables) {
observable.update(m);
}
}
}
data base
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;
}
//insert data
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){
//Add to
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) {
// Remove interface reuse optimization
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);
}
}