设计模式-策略模式

上一篇中复习了下简单工厂模式,今天来回顾一下策略模式。
策略模式:通过将算法的实现和调用相分离,来实现算法行为实现的任意切换。
在我们编程的初始,我们往往通过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
在此表示感谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值