1、概念:
策略模式就是定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。策略模式把对象本身和运算规则区分开来
2、优点:
(1) 消除了代码中的一些if…else,或者case语句;
(2) 可以提供相同行为的不同实现
3、缺点:
(1) 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
(2) 策略模式将造成产生很多策略类
4、这个模式涉及到三个角色:
(1) 环境(Context)角色:持有一个Strategy的引用。
(2) 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
(3) 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
抽象策略类:
public interface Strategy {
/**
* 策略方法
*/
public void strategyInterface();
}
具体策略类:
public class ConcreteStrategyA implements Strategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
环境角色类:
public class Context {
//持有一个具体策略的对象
private Strategy strategy;
/**
* 构造函数,传入一个具体策略对象
* @param strategy 具体策略对象
*/
public Context(Strategy strategy){
this.strategy = strategy;
}
/**
* 策略方法
*/
public void contextInterface(){
strategy.strategyInterface();
}
}
举例:
超市有三种会员,普通会员,银牌会员和金牌会员,每个级别的会员打折力度不同,普通会员按原价出售,银牌会员打9折,金牌会员打8折,并且一个顾客每
消费10000就增加一个级别,那么我们就可以使用策略模式,因为策略模式描述的就是算法的不同。
(1)、首先定义一个用于计算价格策略接口
public interface CalPrice {
//根据原价返回一个最终的价格
Double calPrice(Double orgnicPrice);
}
(2)、 具体策略类:
普通会员的价格计算:
public class Orgnic implements CalPrice {
@Override
public Double calPrice(Double orgnicPrice) {
return orgnicPrice;
}
}
银牌会员的价格计算:
public class SilverVip implements CalPrice {
@Override
public Double calPrice(Double orgnicPrice) {
return orgnicPrice * 0.9;
}
}
金牌会员的价格计算:
public class GoldVip implements CalPrice {
@Override
public Double calPrice(Double orgnicPrice) {
return orgnicPrice * 0.8;
}
}
(3)、客户类帮我们完成会员升级的功能。
public class Player {
private Double totalAmount = 0D;//客户在超市消费的总额
private Double amount = 0D;//客户单次消费金额
private CalPrice calPrice = new Orgnic();//每个客户都有一个计算价格的策略,初始都是普通计算,即原价
//客户购买商品,就会增加它的总额
public void buy(Double amount) {
this.amount = amount;
totalAmount += amount;
if (totalAmount > 20000) {//20000则改为金牌会员计算方式
calPrice = new GoldVip();
} else if (totalAmount > 10000) {//类似
calPrice = new SilverVip();
}
}
//计算客户最终要付的钱
public Double calLastAmount() {
return calPrice.calPrice(amount);
}
}
客户端调用,系统会帮我们自动调整收费策略。
public class Client {
public static void main(String[] args) {
Player player = new Player();
player.buy(5000D);
System.out.println("客户需要付钱:" + player.calLastAmount()); //原价
player.buy(12000D);
System.out.println("客户需要付钱:" + player.calLastAmount()); //9折
player.buy(12000D);
System.out.println("客户需要付钱:" + player.calLastAmount()); //8折
}
}
网友评论