行为型-策略(Strategy)

策略(Strategy)

[TOC]

定义

设计模式也是老生常谈的话题了,这里老衲也就做一个自己归纳的小结论,设计模式其实就是编程经验复用,不局限于某一门语言,是一种思想,一种解决问题的思路,所谓常规的设计模式不过是前人总结出来的编程经验,要学习解决这些问题的经验,更要学习碰到问题应该有何种思考,从哪方面入手,设计契合应用场景的模块架构来。

请先记住一句话:软件的开发周期和维护周期相比,开发所用时间和维护迭代时间相比要少很多,所以我们代码的设计核心应该放在提高可维护性和可扩展性的复用程度

  • 找出应用中可能需要变化的部分,把他们独立出来,不要和不需要变化的代码混合在一起
  • 针对接口编程,而不是针对实现编程
  • 多用组合,少用继承

切入本篇正题,策略模式
策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的调用者。OK,废话不多说,直接上代码,通俗易懂

coding

首先,我们来设计一种应用场景,就拿付钱来说吧,每个人都会为自己的生活买单,买单的方式也多种多样,总结起来,大概是现金和刷卡。那么,我们就来定义一个付钱的借口来。

首先,我们来设计一种应用场景,就拿付钱来说吧,每个人都会为自己的生活买单,买单的方式也多种多样,总结起来,大概是现金和刷卡。那么,我们就来定义一个付钱的接口来。

public interface PayStrategy {
        /**
         * pay for anything
         */
        void pay();
    }

OK,简单粗暴,付钱嘛

接下来,我们为之前的应用场景来搞几个实现这些付款方式的实现类咯~

private static class CashPay implements PayStrategy {

        @Override
        public void pay() {
            System.out.println("现金付款");
        }
    }

    private static class CardPay implements PayStrategy {

        @Override
        public void pay() {
            System.out.println("刷卡付款");
        }
    }

    private static class FacePay implements PayStrategy {

        @Override
        public void pay() {
            System.out.println("脸付");
        }
    }

最后,我们来定义一下具备付款条件的东西,那就是人咯~

private static class Person {

    private PayStrategy payStrategy;

    public Person(String identity) {
        setPayStrategy(identity);
    }

    public void pay() {
        this.payStrategy.pay();
    }

    /**
     * 设置付款人身份
     *
     * @param identity translate param's name
     */
    private void setPayStrategy(String identity) {
        switch (identity) {
            case "richer":
                System.out.println("我是土豪");
                this.payStrategy = new CardPay();
                break;
            case "bricker":
                System.out.println("我是搬砖工");
                this.payStrategy = new CashPay();
                break;
            case "mayun":
                System.out.println("老子是马云爸爸");
                this.payStrategy = new FacePay();
                break;
            default:
                break;
        }
    }
}

这里老衲就图个方便直接粘贴过来了哈,构造里面直接传递付款人的身份,当然我们这里的话付款人就简单定义3个了,分别是土豪,搬砖工和马云爸爸咯。土豪就刷卡,搬砖工就现金咯,马云爸爸这种级别我也不知道,都有可能吧,姑且就给个脸卡吧。(注:这里这是例子,和命名无丝毫关系,喷子退下吧~)

接下来就来run一把爽爽吧

public static void main(String[] args) {
        Person tuhao = new Person("richer");
        tuhao.pay();
        Person banzhuangong = new Person("bricker");
        banzhuangong.pay();
        Person mayun = new Person("mayun");
        mayun.pay();
}

运行结果如下

我是土豪
刷卡付款
我是搬砖工
现金付款
老子是马云爸爸
脸付

好了,编码就那么简单粗暴,您要是没看懂,就再看一遍,下面老衲说一下自己对策略模式(Strategy)的见解

  • 首先,付款这项技能就跟普通攻击似得,谁都会,就是咱们的base算法。

  • 然后就是升级加点了呗,先会现金,然后刷卡,然后就开大直接脸付了呗。这一类加点技能的话其实就是咱们术语里面的算法族。

  • 付款者们无需知道怎么付钱,他们只要付钱即可,没有卡,你的手自然而然掏腰包咯,有卡,自然实力装一波刷卡咯,当生命中没有了钱的概念的时候,哥们,脸即可。

    那么唧唧歪歪下来这么多有什么卵用赖?

    ​ 其实说白了就是这么写,可以去动态的改变你实例所产生的行为,需求发生变更的时候,你可以增加策略,然后让调用者去配置这个新策略即可,缺点就是调用者要知道所有的策略,越来越多臃肿之后,你就会发现尼玛自己都不知道调用哪个了,所以在应用此模式的时候一定要注意使用场景。
      非要推荐一波Android开发中所用到的策略的话,大哥,请借鉴ListView的setAdapter源码,一看结构就能看出来,显而易见,策略模式嘛,这里就不贴过来了,挺朴实一个东西,整复杂了大家烦,写起来也恶心,复杂的系统也是这些朴实的东西堆积起来的,把基础的东西弄明白了,你也可以设计出复杂可靠的系统来,无他,唯手熟尔~

你可能感兴趣的:(行为型-策略(Strategy))