引言 为了应对需求的变更,我们需要采用一些设计模式来降低类之间的耦合度。
一.简介
策略模式将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。
策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
二.优、缺点
优点:
1、可以动态的改变对象的行为
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2、策略模式将造成产生很多策略类
三 .例子
就拿最近引入的短信模板做例子;
原先的写法,每增加一种短信模板类型, 就要增加一个ifelse判断,不利于代码耦合,和阅读性;
引入策略模式之后,只要这样些就足够了,是不是方便很多,阅读性也好很多;
下面我们来看具体引入的写法
1定义策略接口
###策略接口
public interface IStrageType {
String sendMsg(List<User> list, Msg msg);
}
##具体的实现类接口1
@Service("strageTypeDevice")
public class StrageTypeReg implements IStrageType {
@Override
public String sendMsg(List<User> list, MsgDO msg) {
//伪代码
sendMsg("注册短信");
....
return “注册短信成功”;
}
}
##具体的实现类接口2
@Service("strageTypeDevice2")
public class strageTypeDevice2 implements IStrageType {
@Override
public String sendMsg(List<User> list, MsgDO msg) {
//伪代码
sendMsg("认证短信");
....
return “认证短信成功”;
}
}
##具体的实现类接口3
@Service("strageTypeDevice3")
public class strageTypeDevice3 implements IStrageType {
@Override
public String sendMsg(List<User> list, MsgDO msg) {
//伪代码
sendMsg("修改密码短信");
....
return “修改密码短信成功”;
}
}
##具体的实现类接口4
........
策略交给spring管理,定义工具类获取对应的bean类型
public class StrageUtil {
private static Map<String, String> allClazz = new HashMap<String, String>() {{
put("0", "strageTypeDevice1");//注册
put("1", "strageTypeDevice2");//绑定
put("2", "strageTypeDevice3");//重置密码
}};
public IStrageType getInstance(String type) {
Map<String, String> map = StrageUtil.allClazz;
IStrageType stageType = (IStrageType) SpringUtil.getApplicationContext().getBean(map.get(type));
return stageType;
}
}
这样,业务代码直接应用工具类方法就可以了。
StrageUtil.getInstance(0);
//StrageUtil.getInstance(1);
//StrageUtil.getInstance(2);
至此策略模式演示案例就结束了,如有疑问,请给我留言;
献丑了。