首页 > 技术文章 > 策略模式

bigsaltfish 2016-07-14 16:35 原文

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接口的实现类的逻辑来处理即可。











推荐阅读