设计模式:策略模式

1. 模式的定义

假设现在要实现一个简化的报价管理,实现如下的功能:
1. 对于普通客户或者新客户报全价
2. 对于老客户报的价格,统一折扣5%
3. 对于大客户报的价格,统一折扣10%
对不同的人员报不同的价格

到底该如何实现,才能够让价格类中的计算报价的算法,能很容易地实现可维护,可扩展,又能动态地切换变化呢?

策略模式的定义:
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换,使得算法可独立于使用它的客户而变化.
2 实现
Strategy:策略接口,用来约束一系列具体的策略算法,Context使用这个接口来调用具体的策略实现定义的算法

ConcreteStrategy:具体的策略实现,也就是具体的算法实现

代码:
public interface Strategy {
double calcPrice(double price);
}
public class ConcreteStrategyA implements Strategy {

@Override
public double calcPrice(double price) {
System.out.println("对于新客户和普通客户没有优惠");
return price;
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public double calcPrice(double price) {
System.out.println("对于老客户统一折扣5%");
return price*(1-0.05);
}
}
public class ConcreteStrategyC implements Strategy {
@Override
public double calcPrice(double price) {
System.out.println("对于大客户统一折扣10%");
return price*(1-0.1);
}
}
public class PriceManger {
private Strategy strategy;

public PriceManger(Strategy strategy) {
this.strategy = strategy;
}
public double calcPrice(double price){
return strategy.calcPrice(price);
}
}
main方法测试
Strategy strategy = new ConcreteStrategyC();
PriceManger priceManger = new PriceManger(strategy);
double goodprice = priceManger.calcPrice(10000);
System.out.println(goodprice);
策略模式结合模板方法模式
发现一系列的算法的实现上存在公共功能,只是在某些局部步骤上有所不同
代码:
public interface LogStrategy {
public void log(String msg);
}
public abstract class LogStrategyTemplate implements LogStrategy{
public final void log(String msg) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mmm:ss");
msg =df.format(new Date())+"内容是"+ msg;
this.dolog(msg);
}
public abstract void dolog(String msg);

}
public class DbLog extends LogStrategyTemplate {
@Override
public void dolog(String msg) {
System.out.println("将以下信息保存到数据库"+msg);
}
}
public class FileLog extends LogStrategyTemplate {
@Override
public void dolog(String msg) {
System.out.println("将数据保存到文件中"+msg);
}
}
main方法测试
LogStrategy strategy = new DbLog();
strategy.log("这是一个策略模式和模板方法模式结合的案例");

posted @ 2018-06-24 22:14  霸王猿  阅读(104)  评论(0编辑  收藏  举报