设计模式之策略模式
今天我们来讨论策略模式,策略模式是一个比较难理解的模式,尤其是和工厂模式相结合时,当时看程杰的《大化设计模式》时,第二个讲的就是这个,那是一个迷迷糊糊啊,其实仔细分析策略模式并没有那么难,在我们学策略模式之前,先搞明白什么是策略呢?策略是:在某一件事上,在一定的情况下,所采取的行动。当然这个“在一定的情况下”一定是某一种情况,也即是可数的。当情况很多的时候,也许我们要用很多烦人if-else去处理,所以策略模式就是解决这类问题的,其一个典型应用就是在电商平台中:不同的用户有不同的等级享有不同的折扣,我想有些人第一想到的处理方式就是: package cn.bridgeli.demo; public class Strategy { public double discount(String grade, double total) { if ("A".equals(grade)) { return total * 0.6; } else if ("B".equals(grade)) { return total * 0.7; } else if ("C".equals(grade)) { return total * 0.8; } else if ("D".equals(grade)) { return total * 0.9; } else { return total; } } } 我相信这么处理只要看过上篇文章的人都会想到,不满足:开闭原则!当我们新增一个策略时,肯定要该这段代码,增加一个if,当我们的策略发生变化时,例如不仅打折而且在过节时发送促销邮件之类的,那么里面的策略也要改,显然这是一个大问题,那么出现这个问题的根源就是不满足:迪米特原则。 ps:就算不用if-else,用switch-case也有同样的问题。那么用策略模式怎么处理呢? 需要我们首先定义一个策略模式的接口: package cn.bridgeli.demo.service; public interface UserGradeStrategyService { public double discount(); } 下面是具体的策略的实现 package cn.bridgeli.demo.service; public class UserGradeAStrategyService implements UserGradeStrategyService { @Override public double discount() { return 0.6; } } package cn.bridgeli.demo.service; public class UserGradeBStrategyService implements UserGradeStrategyService { @Override public double discount() { return 0.7; } } package cn.bridgeli.demo.service; public class UserGradeCStrategyService implements UserGradeStrategyService { @Override public double discount() { return 0.8; } } package cn.bridgeli.demo.service; public class UserGradeDStrategyService implements UserGradeStrategyService { @Override public double discount() { return 0.9; } } package cn.bridgeli.demo.service; public class UserGradeEStrategyService implements UserGradeStrategyService { @Override public double discount() { return 1.0; } } 有一个策略的容器,这个容器知道都有哪些策略,它里面包含所有的策略: ...