码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式:策略模式

时间:2018-06-24 23:55:41      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:AC   this   一个个   如何   oid   file   数据库   template   功能   

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("这是一个策略模式和模板方法模式结合的案例");

设计模式:策略模式

标签:AC   this   一个个   如何   oid   file   数据库   template   功能   

原文地址:https://www.cnblogs.com/bape/p/9072048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!