设计模式
1.策略模式
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
策略模式的优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点:1、策略类会增多。 2、所有策略类都需要对外暴露。
策略模式涉及到三个角色:
- 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
- 环境(Context)角色:持有一个Strategy的引用。
例如去商店买书,不同会员之间的折扣不同,普通会员不打折,中级会员85折,高级会员6折。
这里MemberStrategy是抽象策略角色。三个实现类是具体策略角色。Price是环境角色。在main方法中,我们需要根据接口实现多态,最终得到价格,示意图代码如下:
public class StrategyDemo {
public static void main(String[] args) {
//选择并创建需使用的策略对象
MemberStrategy dis=new AdvanceMemberStrategy();
//环境角色
Price price=new Price(dis);
//计算价格
double realprice=price.quote(300);
System.out.println("打折后的价格是:"+realprice);
}
}
//计算打折的价格
interface MemberStrategy {
/*
* calPrice是打折后的价格
* bookPrice是打折前的价格
*/
double calPrice(double bookPrice);
}
//初级会员原价
class PrimaryMemberStrategy implements MemberStrategy {
@Override
public double calPrice(double bookPrice) {
return bookPrice;
}
}
//中级会员85折
class IntermediateMemberStrategy implements MemberStrategy {
@Override
public double calPrice(double bookPrice) {
return bookPrice*0.85;
}
}
//高级会员6折
class AdvanceMemberStrategy implements MemberStrategy {
@Override
public double calPrice(double bookPrice) {
return bookPrice*0.6;
}
}
//环境角色
class Price{
private MemberStrategy dis;
//构造函数
public Price(MemberStrategy dis) {
this.dis = dis;
}
//计算打折后价格
public double quote(double bookPrice){
return this.dis.calPrice(bookPrice);
}
}