策略模式(Strategy) 是常用的一种设计模式,顾名思义,可以简单的理解为可以灵活的选择一种谋略(算法)达到某种目的。策略模式共有四个角色,分别为:Context上下文角色、抽象策略角色、具体策略角色、Client客户端,下文将详细介绍他们之家的关系
角色关系
代码实现
interface car {
public int useTime();
}
class Bicycle implements car {
String str = "运动,慢";
public int useTime(start_site, end_site) {
System.out.println(str);
return 40;
}
}
class Electrocar implements car {
String str = "悠闲,快";
public int useTime(start_site, end_site {
System.out.println(str);
return 25;
}
}
class Automobile implements car {
String str = "舒适,堵车";
public int useTime(start_site, end_site) {
System.out.println(str);
return 30;
}
}
class Context {
private Car car;
public void Context(Car car) {
this.car = car;
}
public int getUseTime() {
return car.useTime;
}
}
class Client {
public static void main(String[] args) {
String start_site = "始发站";
String end_site = "终点站";
Context context = new Context(new Bicycle());
return context.getUseTime(start_site, end_site);
}
}
优缺点
优点
- 策略模式符合开闭原则
- 避免使用条件判断语句
- 使用策略模式,可以减少暴露类的其他功能,安全性好
缺点
- 客户端需要知道所有类,并实现该类(一般配合工厂模式使用)
- 会增加很多策略类
对比其他设计模式
学过工厂模式的应该会有一个疑问,为什么不用工厂模式,用策略模式还要再使用工厂模式,以下我们对比一下和策略模式相似的模式的共同点和不同点
对比简单工厂模式
相同点
- 结构很相似
不同点
- 传入参数不同,简单工厂模式,传递的更倾向于类型(不知道返回的是什么类),策略模式传递的是已知的实例
- 返回值不同,简单工厂模式返回的是实例,策略模式返回的是指定的方法
- 工厂是创建型模式,它的作用就是创建对象。策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为
对比静态代理模式
相同点
- 结构很相似,包括传递的参数类型
不同点 - 静态代理模式知道结果,比如找中介买房子,知道会买什么样的房子,及会买到房子。策略是计算结果,不知道内部如何处理
- 静态代理模式,代理类和被代理类继承一个接口,实现同样的方法,策略类不同
个人能力有限,有不足的地方欢迎大家补充