策略设计模式用以封装一系列算法的选择,这些算法通常被封装在一个特定的类中(Context),客户端程序可以自由选择其中的算法,使用策略设计模式的作用是支持算法之间的自由切换。下面以电子商场为普通客户和VIP客户打折为例,说明策略模式的应用:
1.
package com.lanp.change;
/**
* 打折的接口
* @author LanP
* @version v1.0
*/
public interface IMyDiscount {
double getDiscount(double price);
}
2.
package com.lanp.change;
/**
* 普通会员的打折
* @author LanP
* @version v1.0
*/
public class MyPubDiscount implements IMyDiscount {
@Override
public double getDiscount(double price) {
System.out.println("普通会员的商品打折!");
return 0.75 * price;
}
}
3.
package com.lanp.change;
/**
* VIP会员的打折
* @author LanP
* @version v1.0
*/
public class MyVipDiscount implements IMyDiscount {
@Override
public double getDiscount(double price) {
System.out.println("VIP会员的商品打折!");
return 0.5 * price;
}
}
4.
package com.lanp.change;
/**
* 电子商城商品打折的策略类,灵活地提供了不同策略供客户端选择
* @author LanP
* @version v1.0
*/
public class MyDiscount {
private IMyDiscount iMyDiscount;
public MyDiscount(IMyDiscount iMyDiscount) {
this.iMyDiscount = iMyDiscount;
}
public double getDiscountPrice(double price) {
//默认提供普通会员的折扣价
if(null == iMyDiscount) {
iMyDiscount = new MyPubDiscount();
}
return iMyDiscount.getDiscount(price);
}
/**
* 提供用于切换打折策略的方法
* @param iMyDiscount
*/
public void changeIMyDiscount(IMyDiscount iMyDiscount) {
this.iMyDiscount = iMyDiscount;
}
}
5.
package com.lanp.change;
/**
* 测试商品打折的实现类
* @author LanP
* @version v1.0
*/
public class TestMyDiscount {
public static void main(String[] args) {
//没有选择打折时使用默认的打折策略
MyDiscount myDiscount = new MyDiscount(null);
double price = 100;
System.out.println("100元的商品默认折扣价是: " + myDiscount.getDiscountPrice(price));
//普通会员的折扣价
myDiscount.changeIMyDiscount(new MyPubDiscount());
System.out.println("100元商品普通会员的折扣价: " + myDiscount.getDiscountPrice(price));
//VIP会员的折扣价
myDiscount.changeIMyDiscount(new MyVipDiscount());
System.out.println("100元商品VIP会员的折扣价: " + myDiscount.getDiscountPrice(price));
}
}