一、什么是策略模式
策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。
再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。
二、策略模式思想
其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
三、策略模式特点
策略模式体现了面向对象程序设计中非常重要的两个原则:
-
封装变化的概念。
-
编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。
四、策略模式组成
抽象策略角色这个是一个抽象的角色,通常情况下使用接口或者抽象类去实现。对比来说,就是我们的Comparator接口。
具体策略角色包装了具体的算法和行为。对比来说,就是实现了Comparator接口的实现一组实现类。
环境角色内部会持有一个抽象角色的引用,给客户端调用。对比来说,就是我们的TreeSet类。说明:TreeSet内部一定会有一个策略类的一个成员变量,这样做的目的在于可以当我们在去创建TreeSet对象的时候,可以接收我们向TreeSet类中传递的具体的策略类。
四、案例
我们先通过策略模式来实现一个加减乘除的功能。
1、定义抽象策略角色
package com.wmy.designpattern.StrategyPattern;
/**
* @program: design pattern
* @description: 定义抽象策略角色
* @author: wmy
* @create: 2019-10-08 09:43
**/
public interface Strategy {
int calc(int num1, int num2);
}
2、定义具体策略角色
加法策略
package com.wmy.designpattern.StrategyPattern;
/**
* @program: design pattern
* @description: 定义加法策略
* @author: wmy
* @create: 2019-10-08 09:45
**/
public class AddStrategy implements Strategy {
@Override
public int calc(int num1, int num2) {
return num1 + num2;
}
}
减法策略
package com.wmy.designpattern.StrategyPattern;
/**
* @program: design pattern
* @description: 定义减法策略
* @author: wmy
* @create: 2019-10-08 09:46
**/
public class SubStrategy implements Strategy {
@Override
public int calc(int num1, int num2) {
return num1 - num2;
}
}
3、环境角色
package com.wmy.designpattern.StrategyPattern;
/**
* @program: design pattern
* @description: 环境角色
* @author: wmy
* @create: 2019-10-08 09:47
**/
public class Environment {
private Strategy strategy;
Environment(Strategy strategy) {
this.strategy = strategy;
}
/**
* @Description:
* @Param:a
* @Param:b
* @return: int
* @Author:wmy
* @Date:2019/10/8 9:49
*/
public int calulate(int a, int b) {
return strategy.calc(a, b);
}
public static void main(String[] args) {
// new AddStrategy() 为具体的策略类
Environment environment = new Environment(new AddStrategy());
int res = environment.calulate(16, 22);
System.out.println(res);
}
}
五、总结
通过案例的形式相信大家已经对策略模式应该有所了解了吧,其实对比的理解去学习是可以快速上手的。不过在这里呢还是要多说一句,策略模式的缺点其实也很明显,在于策略模式把每一种具体的策略都封装成一个实现类,如果策略有很多的话,很显然是实现类就会导致过多,显得臃肿。其实每种设计模式都有它各种的优缺点,在这里呢,我们就要具体情况具体分析了。