在电商类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();
}
}
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++) {
targetString=productParamDetail.getPriceList().get(i).getPriceKeyword();
if (observable.toString().equalsIgnoreCase(targetString))
{
.getProductPremium()));
break;
}
}
}
嗯,对,大概意思就是这样了!