Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-09-09:请谈谈策略模式原理及其应用场景?

Moosphan opened this issue · comments

2019-09-09:请谈谈策略模式原理及其应用场景?

策略模式的应用范围

1 目前自己知道的策略模式在jdk中的应用有比较器Comparator和布局管理器LayoutManager

2 springmvc 中的处理器映射器

3 在spring中也有用到,通过注解@resource就是使用该模式,注入哪个就使用哪个。

我不知道啊

策略模式很像简单工厂模式,后者是根据业务条件创建不同的对象,前者是根据业务条件去使用不同的策略对象。区别看下图
简单工厂模式
T`3IN )F97H_E549ESMNTV9
策略模式
FCM1@N@O%Q2A({EGW3)3~0F

主要区别在工厂类和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;
     }
}

看了楼上哥们的解释,感觉策略模式就是代理……

1.定义
定义了一系列算法,并将每一个算法封装起来,而且是它们之间可以相互替换. 策略模式让算法独立于使用它的客户而独立变化.

2.使用场景
    (1)对同一类型问题的多种处理方式,仅仅是具体行为有差别时.
    (2)需要安全封装多种同一类型的操作时.
    (3)出现同一抽象类有多个子类, 而又需要使用if-else或者switch-case来选择具体子类时

Android 源码中例子:
时间插值器,加减速插值器, (内部封装了不同的算法,外部只需调用可实现不同的动态效果)

策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略

优点:
    (1)结构清晰明了,使用简单直观
    (2)耦合度相对而言比较低,扩展方便
    (3)操作封装也更为彻底,数据更为安全

缺点:
    (1)随着策略的增加,子类也会变得繁多