策略模式的使用
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);
}
}
策略模式的核心是分离算法,选择实现。
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);
}
}
策略模式的核心是分离算法,选择实现。
相关文章推荐
- Android实现表情 抓取新浪表情
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- 详解JavaScript的策略模式编程
- javascript设计模式--策略模式之输入验证
- 学习JavaScript设计模式(策略模式)
- android开发环境遇到adt无法启动的问题分析及解决方法
- Android开发 旋转屏幕导致Activity重建解决方法
- Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
- Android开发技巧之ViewStub控件惰性装载
- 学习php设计模式 php实现策略模式(strategy)
- Android开发常用经典代码段集锦
- 分享10个很棒的学习Android开发的网站
- android开发之横向滚动/竖向滚动的ListView(固定列头)
- C++编程中使用设计模式中的policy策略模式的实例讲解
- Android开发技巧之我的菜单我做主(自定义菜单)
- 关于.NET Framework中的设计模式--应用策略模式为List排序
- 学习JavaScript设计模式之策略模式
- Java策略模式的简单应用实现方法
- Java设计模式之策略模式(Strategy模式)介绍
- 详解Java编程中的策略模式