前言
大家都是优秀的程序员,相信大家都会遇到过产品设计中玩商城逻辑的设计,各种优惠活动相关的东西。那么 业务需求是这样的,
进货量 优惠 活动各种玩法:
11月1日 -11月3日
- 买 1-5个,就10元一个。
- 买5个以上 ,10个以下,就优惠一点,8元一个。
- 买10个以上,就统一5元一个。
- 。。。。
11月4日 -11月9日
- 买 1-5个, 就9元一个。
- 买5个以上 ,10个以下,就优惠一点,7元一个。
- 买10个以上,就统一4元一个。
- 、、。。。
11月10日 以后
1 3元一个。
。。。。
那么问题就来了。
当这些业务全部弄在一个类中,一个activity 里面,或者一个presenter 里面的话,这个类就会变得臃肿,而且,作为程序猿点够产品需求那边修改的这么快。每次到了下班时候,准备撤退,产品飞快地走过来,改需求,这种家常便饭也是常在的。
而且那种优惠活动,玩法几乎每次都是思维很活跃的情况。一开始代码搞不好,日后加班有你受。维护起来更加无语。
那么事情就来了,封装一下吧。
针对这种类型的业务,抽象出一个接口,接口里面有计算价格的方法。则不同的优惠活动直接以一种实现体的形式,将业务玩抽取一个方法出来统一管理。方便维护以及增加了可读性的操作。而且更加直观,业务扩展更为方便。
package com.twc.buygoods.goods;
public interface CalculatePrice {
/**
* 根据活动来计算价格。
* @param goodsNum
* @return
*/
double calculatePrice(int goodsNum);
}
定义一个抽象接口。
package com.twc.buygoods.goods;
/**
* 优惠活动1
*/
public class DiscountMethod implements CalculatePrice{
/**
* 买 1-5个,就10元一个。
* 买5个以上 ,10个以下,就优惠一点,8元一个。
* 买10个以上,就统一5元一个。
*
* @param goodsNum
* @return
*/
@Override
public double calculatePrice(int goodsNum) {
if (goodsNum > 0 && goodsNum < 5) {
return 10;
} else if (goodsNum >= 5 && goodsNum < 10) {
return 8;
} else {
return 5;
}
}
}
然后一个实现体封装了计算方法。
package com.twc.buygoods;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.twc.buygoods.goods.CalculatePrice;
import com.twc.buygoods.goods.DiscountMethod;
import com.twc.buygoods.goods.OtherDiscountMethod;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
@BindView(R.id.dele)
Button dele;
@BindView(R.id.add)
Button add;
@BindView(R.id.textView)
TextView textView;
@BindView(R.id.price)
TextView price;
@BindView(R.id.totalprice)
TextView totalprice;
private CalculatePrice calculatePrice;
private OtherDiscountMethod calculatePrice2;
private int goodsNum = 0;
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.add:
goodsNum++;
textView.setText(goodsNum + "");
price.setText("本地计算单价:" + calculatePrice.calculatePrice(goodsNum));
totalprice.setText("合计:" + calculatePrice.calculatePrice(goodsNum) * goodsNum + "");
break;
case R.id.dele:
if (goodsNum == 0) {
price.setText("本地计算单价:" + "0");
Toast("数量不能少于0");
return;
}
goodsNum--;
textView.setText(goodsNum + "");
price.setText("本地计算单价:" + calculatePrice.calculatePrice(goodsNum));
totalprice.setText("合计:" + calculatePrice.calculatePrice(goodsNum) * goodsNum + "");
break;
}
}
};
private void Toast(String msg) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
dele.setOnClickListener(listener);
add.setOnClickListener(listener);
calculatePrice = new DiscountMethod();
calculatePrice2 = new OtherDiscountMethod();
}
}
最后activity 里面。
那么方法实现就变得清晰了。
小结:
这个是策略模式的应用。
这个就是 策略模式的应用,抽取封装业务代码,就算产品随便改优惠活动,也可以动态替换实现业务。
是不是很简单的节奏。 可能会有觉得为什么不用静态方法抽取出来计算业务。可以是可以,看你喜欢罗。
认为小编写的文章让你学到东西的,多多支持。
https://github.com/weicheng-74/BuyGoods Demo