策略模式:针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以互相转换。
类型:属于对象的行为模式。
角色:
环境角色:持有一个抽象策略类或策略接口的引用。
抽象策略角色:这是一个抽象角色,由一个接口或抽象类实现。
具体策略角色:封装相关算法或行为。重写抽象策略角色声明的方法。
示例:
商店对不同级别的会员有不同折扣,算法如下:
普通会员无折扣,白银会员95折,黄金会员90折。
代码:
抽象策略角色
public interface MemberI {
public double calcPrice(double price);
}
具体策略角色
public class PrimaryMember implements MemberI {
@Override
public double calcPrice(double price) {
System.out.println("普通会员没有折扣");
return price;
}
}
具体策略角色
public class SilverMember implements MemberI {
@Override
public double calcPrice(double price) {
System.out.println("白银会员,95折");
return price*0.95;
}
}
具体策略角色
public class GoldMember implements MemberI {
@Override
public double calcPrice(double price) {
System.out.println("黄金会员,9折");
return price*0.9;
}
}
环境角色
public class Price {
//持有一个具体的策略对象
private MemberI memberI;
//通过构造函数,传入一个具体的策略对象
public Price(MemberI memberI) {
this.memberI = memberI;
}
//计算商品价格
public double calcPrice(double price){
return this.memberI.calcPrice(price);
}
}
客户端
public class Client {
public static void main(String[] args) {
//创建并选取需要使用的策略对象
MemberI memberI = new SilverMember();
//创建环境
Price price = new Price(memberI);
//计算价格
double goodPrice = price.calcPrice(100);
System.out.println("商品经过打折价格为:"+goodPrice);
}
}
运行结果:
该模式的优点:
1,通过策略类的等级结构来管理算法族。
2,避免在一个类中为了使用不同的算法,将算法的实现和选择混合在一起的多重条件(if-else if-else)语句。
缺点:
1,客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2,由于策略模式把每个算法的具体实现都单独封装成类,针对不同的情况生成的对象会变得很多。