设计模式之策略模式

策略模式

概述

策略模式(Strategy)是一种行为型模式,
好处是我们可以动态的改变对象的行为.针对一组算法或者策略,我们可以将其抽象出来,提供一个统一的接口,不同的算法或者策略有不同的实现类,
通过注入不同的对象实现策略的动态替换,提高扩展性和维护性.

定义

策略模式定义了一系列算法,并将每一个算法封装起来,使得他们可以相互替换,策略模式让算法独立于使用它的客户端,在不影响到客户端的情况下发生变化.

UML


策略模式相当于算法的封装,将算法本身和其实现功能分离开来.

  • Context : 操作策略的上下文环境,持有Strategy引用
  • Strategy: 抽象策略角色,通常是一个接口或抽象类,提供具体策略所需接口.
  • ConcreteStrategy : 具体策略角色,包装了一系列算法或行为.

使用场景

  • 针对同一类型问题的多种处理方式,仅仅是具体行为有差异时.
  • 需要安全的封装多种同一类型的操作时.
  • 出现同一抽象类有多个子类,而又需要根据不同情况来选择具体的子类时.

例子

例子描述:人上班,使用步行或者开车上班;

策略:步行上班、开车上班...

  • 抽象策略接口
package com.dyleaf.behavior.StrategyPattern;

public interface IStrategy {
    public void execute();
}

  • 具体策略
package com.dyleaf.behavior.StrategyPattern;

public class DriveStrategy implements IStrategy {
    @Override
    public void execute() {
        System.out.println("driving。。。");
    }
}

package com.dyleaf.behavior.StrategyPattern;

public class WalkStrategy implements IStrategy {
    @Override
    public void execute() {
        System.out.println("Walking。。。");
    }
}

  • 环境
package com.dyleaf.behavior.StrategyPattern;

public class Context {

    IStrategy strategy;

    public Context(IStrategy strategy) {
        this.strategy = strategy;
    }

    public void execute() {
        this.strategy.execute();
    }
}

  • 客户端
package com.dyleaf.behavior.StrategyPattern;

public class Test {
    public static void main(String[] args) {
        Context context = null;
        context = new Context(new WalkStrategy());
        context.execute();
        context = new Context(new DriveStrategy());
        context.execute();
    }
}

示例二 JDK中的示例,Collections.sort方法

不需为新的对象修改sort()方法,你需要做的仅仅是实现你自己的Comparator接口

    Collections.sort(
        list,   //待排序的集合
        new Comparator<>(){  //具体排序策略
        @Override  
        public int compare(A a1, A a2) {  
            return ; //具体大小判断规则
        }  
    });  

策略模式的特点

  • 封装具体的策略和算法,而在什么情况下使用什么算法是由客户端决定的.
  • 其重心并不是如何实现算法,而是如何组织和调用这些算法.
  • 策略模式中各个算法的地位是平等的,相互独立的,因此可以相互替换.
  • 策略中虽然有一组算法,但是在某一时刻,只能使用其中一个

补充说明

与状态模式区别:使用策略模式时,客户端手动选择策略,使用状态模式时,其行为是根据状态是自动切换的。

see source code

posted @ 2018-03-05 01:50  Dyleaf  阅读(222)  评论(0编辑  收藏  举报