上一篇中复习了下简单工厂模式,今天来回顾一下策略模式。
策略模式:通过将算法的实现和调用相分离,来实现算法行为实现的任意切换。
在我们编程的初始,我们往往通过if..else or swich 来应对根据运行的状态来选择对应的算法。这就导致要添加新的算法时,我们需要去修改原先写好的逻辑代码,违反了开放-封闭原则,同时将对算法的选择也冗杂到算法的实现类中也违背了单一职责。所以重新回顾我们的目标:
1.制定算法选择逻辑
2.实现对应逻辑的算法
根据这两个目标我们可以将算法类拆解成 算法上下文 和 算法实现类。下面我们举例分析
我想做一个网站自动签到的程序,首先我就要登陆到网站上去。但是不同的网站的登陆方式基本相似,采用用户名密码进行登陆,主要的不同在于用户信息传递的方式,例如 明文传递,加密传递,转码传递等等。
/**
* @author Created by yanjy on 2017/11/12.
*/
public interface ILoginService {
/**
* @param userName
* @param passwd
*/
void loginIn(String userName, String passwd);
}
/**
* @author Created by yanjy on 2017/11/12.
*/
public class CSDNLoginImpl implements ILoginService {
@Override
public void loginIn(String userName, String passwd) {
System.out.print("csdn is loginning");
}
}
/**
* @author Created by yanjy on 2017/11/12.
*/
public class JianShuLoginImpl implements ILoginService {
@Override
public void loginIn(String userName, String passwd) {
System.out.print("jianshu is loginning");
}
}
/**
* @author Created by yanjy on 2017/11/12.
*/
public class LoginContext {
private ILoginService iLoginService;
LoginContext(ILoginService iLoginService) {
this.iLoginService = iLoginService;
}
public void Login(String userName, String passwd) {
iLoginService.loginIn(userName, passwd);
}
public static void main(String[] args) {
LoginContext loginContextCSDN = new LoginContext(new CSDNLoginImpl());
loginContextCSDN.Login("aa", "bb");
LoginContext loginContextJianShu = new LoginContext(new JianShuLoginImpl());
loginContextJianShu.Login("cc", "dd");
}
}
在使用的过程中需要注意如下几点:
1.重心倾向如何组织算法,而不是实现算法。
2.不同算法在调用时可以任意切换,即等价性
3.在程序被调用起来的时候,使用的算法要是唯一且确定的。
4.算法的共有行为要及早的提取到Context或者抽象类中中 统一管理
策略模式的优点:
1.根据行为将算法归类为算法族/行为族,来进行统一管理。
2.将调用和实现逻辑相分离,通过将共有方法提取到抽象类中,便于代码管理。
策略模式的缺点:
1.需要有一个位置来记录算法类的调用逻辑,以便能够根据需求选择合适的算法。
2.策略激增会导致类的激增。
本文主要参考了
<大话设计模式>
https://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
在此表示感谢。