zoukankan      html  css  js  c++  java
  • 设计模式之策略模式

    策略模式

    概述

    策略模式(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

  • 相关阅读:
    Java程序设计:最大连续1的个数(LeetCode:485)
    LeetCode刷题经验2
    LeetCode刷题经验
    Java程序设计:区域和检索—数组不可变(LeetCode:303)
    Java程序设计:在排序数组中查找元素的第一个和最后一个位置(LeetCode:34)
    解决安装python3后yum不能使用情况
    使用shell做数据库备份的时候,遇到了以下问题,原因未知
    使用windows系统编写shell代码,在linux执行后的报错
    Apache URL重写规则
    PHP中的环境变量$_ENV, $_SERVER 及getenv
  • 原文地址:https://www.cnblogs.com/Dyleaf/p/8507054.html
Copyright © 2011-2022 走看看