Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Moosphan opened this issue Sep 9, 2019 · 5 comments
Open

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

Moosphan opened this issue Sep 9, 2019 · 5 comments

Comments

@Moosphan
Copy link
Owner

Moosphan commented Sep 9, 2019

No description provided.

@gabyallen
Copy link

策略模式的应用范围

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

2 springmvc 中的处理器映射器

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

@zoushaohua
Copy link

我不知道啊

@leenickcode
Copy link

leenickcode commented Oct 11, 2019

策略模式很像简单工厂模式,后者是根据业务条件创建不同的对象,前者是根据业务条件去使用不同的策略对象。区别看下图
简单工厂模式
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;
     }
}

@weikano
Copy link

weikano commented Oct 11, 2019

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

@xiaoxianBoy
Copy link

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

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

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants