2019-09-09:请谈谈策略模式原理及其应用场景?
Moosphan opened this issue · 5 comments
Moosphan commented
2019-09-09:请谈谈策略模式原理及其应用场景?
gabyallen commented
策略模式的应用范围
1 目前自己知道的策略模式在jdk中的应用有比较器Comparator和布局管理器LayoutManager
2 springmvc 中的处理器映射器
3 在spring中也有用到,通过注解@resource就是使用该模式,注入哪个就使用哪个。
zoushaohua commented
我不知道啊
leenickcode commented
策略模式很像简单工厂模式,后者是根据业务条件创建不同的对象,前者是根据业务条件去使用不同的策略对象。区别看下图
简单工厂模式
策略模式
主要区别在工厂类和CashContext这个两个类
工厂 类
public class ShapeFactory {
public static Shape createShape(String shape){
switch (shape){
case "circle":
return new Circle();
case "rectangle":
return new Ractangle();
}
return null;
}
}
CashContext
class CashContext{
Strategy strategy;
public CashContext(Strategy strategy ){
this.strategy = strategy;
}
//操作业务
public void method(){
strategy.method;
}
}
区别:
1工厂没有持有具体类的引用,策略构造器(CashContext)持有了具体类的引用,
2 工厂根据条件创建不同的对象,此时的策略构造器(CashContext)要在activity中做条件判断(很明显这里可以和简单工厂模式结合)
可知简单工厂一旦新增了具体类,工厂类就要做修改,但是策略模式不用修改CashContext类,他直接替换具体类。
但是当我们需要根据条件创建具体类的时候,策略模式会使得要在activity中做条件判断来确定创建什么具体类。这里又想到了使用工厂来优化。
结合简单工厂模式后的策略构造器(CashContext)
class CashContext{
Strategy strategy;
public CashContext(string condition){
switch (condition){
case "circle":
strategy = new CicleStrategy();
break;
case "rectangle":
strategy = new RectangleStrategy();
break;
}
}
//操作业务
public void method(){
strategy.method;
}
}
weikano commented
看了楼上哥们的解释,感觉策略模式就是代理……
xiaoxianBoy commented
1.定义
定义了一系列算法,并将每一个算法封装起来,而且是它们之间可以相互替换. 策略模式让算法独立于使用它的客户而独立变化.
2.使用场景
(1)对同一类型问题的多种处理方式,仅仅是具体行为有差别时.
(2)需要安全封装多种同一类型的操作时.
(3)出现同一抽象类有多个子类, 而又需要使用if-else或者switch-case来选择具体子类时
Android 源码中例子:
时间插值器,加减速插值器, (内部封装了不同的算法,外部只需调用可实现不同的动态效果)
策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略
优点:
(1)结构清晰明了,使用简单直观
(2)耦合度相对而言比较低,扩展方便
(3)操作封装也更为彻底,数据更为安全
缺点:
(1)随着策略的增加,子类也会变得繁多