观察者模式

2019-04-14 19:52发布

在电商类app中会常见一种功能,修改一个商品的某些属性,页面上显示的价格会跟随变化,这样的功能可以通过观察者模式去实现.通常可以同时存在多个观察者和多个被观察者,观察者和被观察者也不是对立的,一个对象可以观察其他对象,也可以被其他对象观察,而本文一开始举的例子属于价格这一观察者同时观察多个被观察者,这里说的被观察者也就是指商品的属性.
现在以我的代码作为例子,首先构建一个被观察者,其中封装了添加或修改商品属性后需要调用的方法,通知价格控件(textview)所在的类(也就是观察者)做出响应 public class KeyBeanObservable extends Observable{ //商品属性所在的集合 private KeyBean keyBean=new KeyBean(); //购买份数 private int count=1; //购买份数发生变化时,通知观察者改变价格 public void setCount(int count) { this.count = count; setChanged(); notifyObservers(); } //添加商品属性后,通知观察者改变价格 public void add(String str) { keyBean.add(str); setChanged(); notifyObservers(); } //修改商品某一属性,后,通知观察者改变价格 public void set(int index, String str) { keyBean.set(index,str); setChanged(); notifyObservers(); } public int getSize() { if (keyBean==null) { return 0; } return keyBean.size(); } @Override public String toString() { return keyBean.toString(); } } /**拼接字符串,将用户选择的属性进行拼接,方便与后台返回数据进行匹配,后台返回数据如: 标准计划;0-5,无;1年; * Created by Administrator on 2017/8/15. */ public class KeyBean extends ArrayList<String>{ @Override public String toString() { StringBuilder builder = new StringBuilder(); if (!isEmpty()) { int size = size(); if (size==1) { builder.append(get(0)+";"); } else if (size==2) { builder.append(get(0)+";"); builder.append(get(1)+";"); } else { for (int i = 0; i < size; i++) { if (i==0) { builder.append(get(0)+";"); } else if (i>=size-2) { builder.append(get(i)+";"); } else { builder.append(get(i)+","); } } } builder.deleteCharAt(builder.length()-1); } return builder.toString()+";"; } } 以下是观察者,数据请求也发生在这个类中 public class ProductDetailPresenter extends ProductDetailContract.Presenter implements Observer{ ProductParamDetail productParamDetail; String[] periods; //被观察者 KeyBeanObservable observable; @Override public void onAttached() { //实例化被观察者 observable = new KeyBeanObservable(); //添加观察者 observable.addObserver(this); } @Override public void getProductDetail(String productId) { mModel.getProductDetail(productId, new PostCallback(mView) { 通过调用被观察者中封装的方法,添加商品属性这一被观察者 //添加商品属性 observable.add(initPeriod); 修改完某一商品属性后,调用自定义封装的方法 //修改某一商品属性 observable.set(index, priceElement); index是因为我需要将商品属性按照指定位置插入集合,当然也是为了配合后台返回的数据 每当属相发生变化时,会自动调用到观察者类中重写的这个方法 @Override public void update(Observable o, Object arg) { String targetString=""; for (int i = 0; i < productParamDetail.getPriceList().size(); i++) { //取出后台返回的某一种组合的价格如: 标准计划;0-5,无;1年; targetString=productParamDetail.getPriceList().get(i).getPriceKeyword(); if (observable.toString().equalsIgnoreCase(targetString)) { //修改价格 mView.setPrice(DisplayUtils.fromFenToYuan(productParamDetail.getPriceList().get(i) .getProductPremium())); break; } } } 嗯,对,大概意思就是这样了!