策略模式是我在编程学习中学到的第三个设计模式 在此用我自己的理解结合网上的教程概括一下设计模式.
策略模式的用途
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
策略模式的核心
用模板将所有策略封装起来 降低系统耦合度
枚举策略
public enum AnnualFee {
VIP5("vip5") {
@Override
public int amount(int year) {
// TODO Auto-generated method stub
return year*80;
}
},VIP4("vip4") {
@Override
public int amount(int year) {
// TODO Auto-generated method stub
return year*85;
}
},VIP3("vip3") {
@Override
public int amount(int year) {
// TODO Auto-generated method stub
return year*90;
}
},VIP2("vip2") {
@Override
public int amount(int year) {
// TODO Auto-generated method stub
return year*95;
}
},VIP1("vip1") {
@Override
public int amount(int year) {
// TODO Auto-generated method stub
return year*100;
}
};
private String rights;
public abstract int amount(int year);
private AnnualFee(String rights) {
this.rights = rights;
}
public String getRights() {
return rights;
}
public void setRights(String rights) {
this.rights = rights;
}
}
这是我在学习策略模式的时候写的一个年费策略 根据不同vip等级 传入未付费的年数 得到需要付费的金额
double amount = AnnualFee.valueOf(rights).amount(year);
枚举策略需要的context就是枚举类本身 而重写的每个amount方法就是具体的strategy
当然 也引出了其他问题 如果我事先不知道我的vip等级 我就少不了一大堆冗长的if-elseif语句(这里用了enum.valueOf,当时没想到用工厂模式)而这是也是策略模式的缺点,通常策略模式不单独出现,要配合其他设计模式一起使用