Observation data insertion of observer design pattern

Keywords: Java

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);
    }
}

Posted by nonaguy on Sun, 05 Apr 2020 00:29:58 -0700