在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。
这个模式涉及到三个角色:
● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
demo:普通会员不打折,初级会员打8折,高级会员打5折
package com.meicai.strategy;策略接口/抽象类
/**
* Created by meicai on 2017/5/11.
*/
public interface IMemberStrategy {
/**
* 策略方法 计算会员价格
* @param booksPrice
* @return
*/
public double calcPrice(double booksPrice);
}
package com.meicai.strategy;初级会员策略
/**
* 初级会员策略
* Created by meicai on 2017/5/11.
*/
public class ChuJiMemberStrategy implements IMemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println("初级会员不打折");
return booksPrice;
}
}
package com.meicai.strategy;中级会员策略
/**
* 中级会员策略
* Created by meicai on 2017/5/11.
*/
public class ZhongJiMemberStrategy implements IMemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println("中级会员打8折");
return booksPrice*0.8;
}
}
package com.meicai.strategy;高级会员策略
/**
* 高级会员策略
* Created by meicai on 2017/5/11.
*/
public class GaoJiMemberStrategy implements IMemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println("高级会员打5折");
return booksPrice*0.5;
}
}
package com.meicai.strategy;环境角色类
/**
* 环境角色类
* Created by meicai on 2017/5/11.
*/
public class Price {
//持有一个具体策略的对象
private IMemberStrategy iMemberStrategy;
// 构造函数,传入一个具体策略对象
public Price(IMemberStrategy memberStrategy){
this.iMemberStrategy=memberStrategy;
}
//策略方法
public double getPrice(double bookPrice){
return this.iMemberStrategy.calcPrice(bookPrice);
}
}
import com.meicai.strategy.GaoJiMemberStrategy;测试代码
import com.meicai.strategy.IMemberStrategy;
import com.meicai.strategy.Price;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by meicai on 2017/5/9.
*/
public class Test {
public static void main(String[] args) {
GaoJiMemberStrategy gaoJiMemberStrategy=new GaoJiMemberStrategy();
Price price=new Price(gaoJiMemberStrategy);
double dPrice= price.getPrice(10);
System.out.println(dPrice);
}
}