您的位置:首页 > 移动开发 > Android开发

策略模式的使用

2016-05-27 10:36 471 查看
假设有这样一种情况,有这个客户群体,小客户小批量,小客户大批量,大客户小批量,大客户大批量,针对不同的客户对价格进行打折,常用的写法可能会这样写:

public class PriceStrategy {

public double getPrice(String type, double price) {
double realPrice = 0;
if (type.equals("小客户小批量")) {
realPrice = price * 1;
} else if (type.equals("小客户大批量")) {
realPrice = price * 0.9;
} else if (type.equals("大客户小批量")) {
realPrice = price * 0.85;
} else if (type.equals("大客户大批量")) {
realPrice = price * 0.8;
}
return realPrice;
}
}

这样写简单粗暴,但是这样写的坏处就是不方便扩展,比如我增加了一些新的客户群体或者打折的策略变了,都需要去修改已有的代码,不符合开闭原则,再者如果打折的算法是很复杂的,一次性写到一个类里面会非常臃肿。
我们可以采取策略模式来实现这种场景,策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决问题,同时可以方便的更换算法或者增加新的算法,并由客户端决定调用哪个哪个算法。

首先我们定义一个接口

public interface PriceInterface {
double getPrice(double price);
}


然后写出这4种客户群体的实现类,不同的群体算法不一样
小客户小批量不打折

public class NewCusFewPriceStrategy implements PriceInterface {
@Override
public double getPrice(double price) {
System.out.print("不打折");
return price;
}
}

小客户大批量打9折
public class NewCusManyPriceStrategy implements PriceInterface {
@Override
public double getPrice(double price) {
System.out.print("打9折");
return price * 0.9;
}
}

大客户小批量打8.5折
public class OldCusFewPriceStrategy implements PriceInterface {
@Override
public double getPrice(double price) {
System.out.print("打8.5折");
return price*0.85;
}
}

大客户大批量打8折
public class OldCusManyPriceStrategy implements PriceInterface {
@Override
public double getPrice(double price) {
System.out.print("打8折");
return price * 0.8;
}
}

这样就实现了一个算法族,然后还要写一个管理类来统一调用这些实现类
public class Context {
private PriceInterface mPriceStrategy;

public Context(PriceInterface priceStrategy) {
mPriceStrategy = priceStrategy;
}

public void printPrice(double price) {
System.out.print("你的报价:" + mPriceStrategy.getPrice(price));
}
}

最后在类里面的使用如下
public class ClientText {
public static void main(String args[]) {
OldCusManyPriceStrategy lOldCusManyPriceStrategy = new OldCusManyPriceStrategy();
Context lContext = new Context(lOldCusManyPriceStrategy);
lContext.printPrice(998);
}
}


策略模式的核心是分离算法,选择实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息