观察者设计模式之观察数据的插入

观察者设计模式之推拉模式

推模式:如:用户关注微信号

微信公众号: 多个人去订阅我们的公众

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集合封装类
效果图.png

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值