MVP模式+Build模式+Observe模式

    这是小弟我的第一篇博客,最近也是看了几位大神的blog自己尝试写了写几种模式开发软件,用了一下午的时间写了点东西,这里作为总结。

    MVP模式:
    M层:负责定义一个实体类包含对象的属性已经处理这些属性的业务逻辑;
    V层:负责展示界面以及得到Presenter层通知得到相应Model后页面刷新;
    P层:处理V层发送的对应事件与Model,进行业务逻辑处理,将得到的最红Model数据信息通知给V层。

    观察者模式:
    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,
使它们能够自动更新自己。

    Builder模式:
    Builder模式是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。

    这几个模式大概的意思就是这样,如果我理解的不对请大神批评并加以指导。
    说了这么多说实话还是来个Demo吧,有了Demo更好理解
    下面这段代码是利用Builder模式构造的实体类:
    UserBean.java

    public class UserBean {
    public int age;
    public String name;
    public float bodyWeight;
    public float height;
    public int likeCount;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getBodyWeight() {
        return bodyWeight;
    }
    public void setBodyWeight(float bodyWeight) {
        this.bodyWeight = bodyWeight;
    }
    public float getHeight() {
        return height;
    }
    public void setHeight(float height) {
        this.height = height;
    }
    public int getLikeCount() {
        return likeCount;
    }
    public void setLikeCount(int likeCount) {
        this.likeCount = likeCount;
    }
    public static class Builder {
        UserBean userBean;
        public Builder() {
            this.userBean = new UserBean();
        }
        public Builder setName(String name) {
            this.userBean.setName(name);
            return this;
        }
        public Builder setAge(int age) {
            this.userBean.setAge(age);
            return this;
        }
        public Builder setBodyWeight(float bodyWeight) {
            this.userBean.setBodyWeight(bodyWeight);
            return this;
        }
        public Builder setHeight(float height) {
            this.userBean.setHeight(height);
            return this;
        }
        public UserBean build() {
            return this.userBean;
        }
    }
}

代码很简单,看一眼基本就会用了,调用时如下:

UserBean userBean = new UserBean.Builder().setAge(18)
            .setName("Bernie")
            .setHeight((float) 175.0)
            .setBodyWeight((float) 80.0)
            .build();

好了Buidl模式就基本上这样了:
在看看MVP的具体实现,首先编写一个接口,用来接受P层处理完数据之后刷新页面的回调函数:
Presenter.java

public interface Presenter<T> {
    public void like(T t);
}

然后写一个简单的Activity很简单,一个Button,一个TextView,点击Button将事件发给P层,P层将SP中的点赞数加1,返回被赞总数,然后回调like函数实现页面刷新。
MainActivity .java

public class MainActivity extends Activity implements 
        Presenter<UserBean>, View.OnClickListener {
    Button likeButton;
    TextView likeText;
    SharedPreferences sharedPreferences;
    public SharedPreferences.Editor editor; 
    Context context;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = getApplication();
        sharedPreferences =  
             SingleUserBeanSP.getSingleUserBeanSP(contxet);
        editor = sharedPreferences.edit();
        userBean = new UserBean.Builder().setAge(18)
            .setName("Bernie")
            .setHeight((float) 175.0)
            .setBodyWeight((float) 80.0)
            .build();

        likeButton = (Button) findViewById(R.id.likeButton);
        likeText = (TextView) findViewById(R.id.likeText);
        likeButton.setOnClickListener(this);
    }
    @Override
    public void like(UserBean userBean) {
        likeText.setText(userBean.getName() + "\n"
                        + "likeCount = " + userBean.getLikeCount());
            }
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.likeButton:
                new UserBeanPresenter(userBean, this, sharedPreferences,editor);
                break;
            }
        }
}

这里面点击事件使用了UserBeanObserver的构造方法,
看到了Observer这个很明显啊是一个观察者,这个时候我们需要定义一个统一的观察者接口.

public interface Observer<T> {
    public void updateNotify(T t);
}

很简单,我们的UserBeanObserver显然是一个观察者,所以他就要实现观察者这个接口了.
UserBeanPresenter .java

public class UserBeanPresenter implements Observer<UserBean>{
    Presenter<UserBean> presenter;
    public UserBeanPresenter(UserBean userBean,Presenter<UserBean> presenter,SharedPreferences sharedPreferences,SharedPreferences.Editor editor){
        this.presenter = presenter;
        final SubObserver subObserver = new ConcreteSubObserver();
        subObserver.add(this);
        new SetDataToSp(userBean,sharedPreferences,editor,subObserver);
    }
    @Override
    public void updateNotify(UserBean userBean) {
        presenter.like(userBean);
    }
}

UserBeanPresenter构造方法中声明了subObserver这个顾名思义就是被观察者,因为这个别观察者是唯一的所以首先书写一个接口SubObserver
SubObserver .java

public interface SubObserver {
    public void add(Observer observer);
    public void remove(Observer observer);
    public void notifyWatcher(UserBean userBean);
}

三个方法看名字与参数就知道是用来干嘛的了,对了就是加入,去掉,通知观察者这样的操作,而他的具体实现为
ConcreteSubObserver.java

public class ConcreteSubObserver implements  SubObserver{
    private List<Observer> list = new ArrayList<>();
    @Override
    public void add(Observer observer) {
        list.add(observer);
    }
    @Override
    public void remove(Observer observer) {
        list.remove(observer);
    }
    @Override
    public void notifyWatcher(UserBean userBean) {
        for (Observer observer : list) {
            observer.updateNotify(userBean);
        }
    }
}

也是看一眼就知道是用来干嘛的了就不详细说了.
然后回到UserBeanPresenter的构造方法中
UserBeanPresenter.java

final SubObserver subObserver = new ConcreteSubObserver();
subObserver.add(this);    
new  SetDataToSp(userBean,sharedPreferences,editor,subObserver);

这个很好理解把这个观察者加到被观察者的队列中,如果被观察的对象改变这个观察者就会得到通知。
最后一个类,处理被观察对象,实现业务逻辑,被观察者改变时通知所有的观察者:
SetDataToSp.java

public class SetDataToSp {
    public SetDataToSp(UserBean userBean,SharedPreferences sharedPreferences,SharedPreferences.Editor editor,SubObserver subObserver){
        setData(userBean,sharedPreferences,editor,subObserver);
}
    public void setData(UserBean userBean,SharedPreferences sharedPreferences,SharedPreferences.Editor editor,SubObserver subObserver) {
        int likeCount = sharedPreferences.getInt("like",0);
        editor.putInt("like",++likeCount);
        editor.commit();
        userBean.setLikeCount(sharedPreferences.getInt("like",0));
        subObserver.notifyWatcher(userBean);
    }
}

这样观察者得到了被观察者的通知,观察者在回调函数中在通知Activity更新界面,广义上来讲,这种实现的MVP模式Activity是作为P层中某个业务类的观察者存在的。
哦还漏了一个类SingleUserBeanSP.java,这个类我是为了写一个单例模式写的,其实作用不大,采用双重检验锁的方式,这里就不贴出来了。
Demo已经上传到我的Github上面去了,有兴趣的同学可以clone下来看看,多提意见,毕竟本人刚刚开始把这些东西整理成blog,而且技术水平有限欢迎同学指教。
Git地址:https://github.com/ss831116/DesignPatternsDemo.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值