首页 > 代码库 > 策略模式

策略模式

近期开始对自身开始巩固学习,先从设计模式开始。

 

策略,可以理解为对一个问题的解决方案的集成,用程序语言来描述的话,可以叫做一种算法。

 

对应的我可以想到的是Collections.sort方法

 

里面的算法我也看的晕乎乎

 

不过关键的点还是在于 Collections.sort的第二个参数,Comparator

public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
}

 

注意这是一个接口,是一个接口,是一个接口!

 

好吧,反正这就是个回调接口,意思就是你告诉我怎么比较大小,我帮你排序。

 

这里的怎么比较大小就是一个算法。

 

而且是在动态运行过程中,你随时可以改变的,所以我们也把策略模式归为 行为类模式 -- 可在运行过程中改变自身行为。

 

不过到这,我们应该还是很模糊,究竟策略模式的表现是什么样的,这里我用不上工科生的方式解释,因为我也看不懂一堆理论公式的。

 

首先,我们要有个环境,因为没有环境的话,策略是没有依托的。我们这边就用个谋士的例子吧。

 

我们知道三国时期,刘备初期的谋士是徐庶。

 

后来曹操得知有这么个人才在敌人堆里,又打听到徐庶是个孝子,就把他母亲接过来,逼着徐庶跑到曹操阵营去了。

 

那么好了,这离职吧,得推荐个接班人吧。于是徐庶推荐了自己的好友:卧龙先生。

 

接着就是我们耳熟能详的三顾茅庐的故事啦。

 

这里其实体现了策略模式的几个特点:

  1. 需要在某个环境下(刘备阵营或曹操阵营)
  2. 得先知道有这个人,才能招吧?(不是徐庶推荐,刘备怎么会知道诸葛亮这人呢?)
  3. 不同时期,可以替换不同的对象

这边还是习惯性的用代码的简单Demo来表示下

package top.gabin.design.model.strategy;

/**
 * 行为是 打扫房间
 *
 * @author linjiabin on  2017/2/10
 */
public interface CleanRoot {
    void clean();
}

package top.gabin.design.model.strategy;

/**
 * @author linjiabin on  2017/2/10
 */
public class Mother implements CleanRoot {
    @Override
    public void clean() {
        System.out.println("妈,我的袜子哪去啦");
    }
}
package top.gabin.design.model.strategy;

/**
 * 家政人员
 *
 * @author linjiabin on  2017/2/10
 */
public class Housekeeping implements CleanRoot {

    @Override
    public void clean() {
        System.out.println("好干净啊!一尘不染!");
    }
}
package top.gabin.design.model.strategy;

/**
 * 程序员,是我
 *
 * @author linjiabin on  2017/2/10
 */
public class Programmer implements CleanRoot {
    @Override
    public void clean() {
        System.out.println("额,老公,你是拿扫把扫了一下地吗?");
    }
}
package top.gabin.design.model.strategy;

/**
 *
 * @author linjiabin on  2017/2/10
 */
public class MyWife {
    private static CleanRoot cleaner;

    public static void main(String[] args) {
        cleaner = new Programmer();
        cleaner.clean();
        cleaner = new Mother();
        cleaner.clean();
        cleaner = new Housekeeping();
        cleaner.clean();
    }

}

执行一下:

额,老公,你是拿扫把扫了一下地吗?
妈,我的袜子哪去啦
专业的就是不一样,打扫的好干净啊!一尘不染!

 

在要打扫屋子的这个事件中,老婆手头上有这几个人可以使唤,最容易的是老公程序员,然后是老妈,最后是家政人员,要钱!其次,他们都懂得打扫房间(只是……)所以,用一下先,不好再换咯。

 

这就是我理解中的策略模式~

 

策略模式