策略模式
1.行为类
具体的打折的计算的接口和实现类
public interface Discount {
public Double calculatePrice(Double price);
}
public class ChilderDiscount implements Discount {
@Override
public Double calculatePrice(Double price) {
return price - 10;
}
}
public class StudentDiscount implements Discount {
@Override
public Double calculatePrice(Double price) {
return price * 0.8;
}
}
public class VipDiscount implements Discount{
@Override
public Double calculatePrice(Double price) {
System.out.println("增加积分");
return price * 0.5;
}
}
public class MovieTicket {
private Discount dis;
public Double price;
public void setDis(Discount dis){
this.dis = dis;
}
public Double getPrice(){
return dis.calculatePrice(price);
}
}
2.程序入口
public class M {
public static void main(String[] args) {
Discount dis_children = new ChilderDiscount();
Discount dis_student = new StudentDiscount();
MovieTicket mt = new MovieTicket();
mt.setDis(dis_student);
mt.price = 100d;
Double d = mt.getPrice();
System.out.println("原价100 学生价格是:" + d);
mt.setDis(dis_children);
mt.price = 100D;
System.out.println("原价100 儿童价格是:" + mt.getPrice());
}
}
策略模式的使用场景
需求场景:电影票类,对待不同的用户(儿童、学生、vip、正常成年人票价),若我们把逻辑都放到movieTicket类中实现,那么,如果我们新增了一个用户类型,这样的话,需要修改movieTicket代码,不符合开闭原则。
我们可以把用户抽象出一个类,这个类的实现类负责处理不同身份的具体处理逻辑。我们在movieTicket类中,只需要根据传入的discount接口的实现类的逻辑来处理即可。