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

    策略模式(strategy pattern)

    定义>>

    将一系列的算法封装到一些列的类里面,并且可以相互替换

    作用>>

    将算法的变化独立于客户端,将算法的指责和算法的行为分开,将算法的使用和具体的算法流程区分开

    组成>>

    策略类:封装了一个算法实现;一般只暴漏一个方法供其它地方调用,比如排序,查找,计算折扣等等
    抽象策略类:既然一种算法代表一个策略类,那么多种算法就需要定义多个策略类,这些策略类的共性是只暴漏了一个方法,而且算法的职责是相似的,算法的步骤可能是大不相同的。这个时候就可以定义一个抽象的策略类(可以是抽象类,也可以是个接口),来包装各个策略类,而这些策略类也需要继承/抽象定义好的抽象策略类 。

    图例>>

    优缺点>>

    优点:对“开闭原则”的完美支持,在不修改原有系统的基础上更换算法或者增加新的算法,避免多重条件转移语句的实现方式;
    缺点:客户端必须知道所有的策略类,并理解其区别;一定程度上增加了系统中类的个数,可能存在多个策略类

    实例>>

    例子:

    1. 书城要打折,不同种类的书都有不同的折扣。怎么设计返回书价的接口?
    2. 比较策略:比如要比一个人牛逼不牛逼,可以通过能力,颜值,财富等等各个方面;每个方面都可以生成一个比较器;AblityComparator impements Comparator; Collections是环境角色;
    3. 排序策略:比如自己实现一个排序器,作为一个排序策略的抽象接口;然后由实现类充当各个排序策略(与比较策略比较相似,可以进行联想记忆)
    4. ThreadPoolExecutor中的四个拒绝策略;抽象接口是RejectedExecutionHandler, 四个实现策略:ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.DiscardPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.CallerRunsPolicy;ThreadPoolExecutor是环境角色
  • 相关阅读:
    [leetCode]945.使数组唯一的最小增量
    [leetCode]974. 和可被 K 整除的子数组
    [leetCode]1035.不相交的线
    [leetCode]面试题 10.01. 合并排序的数组
    [leetCode]面试题04.二维数组
    [面试题03]数组中的重复数字
    [leetCode]169.多数元素
    [leetCode]160.相交链表
    [leetCode]155.最小栈
    POJ 2127 Greatest Common Increasing Subsequence
  • 原文地址:https://www.cnblogs.com/nolan4954/p/9977412.html
Copyright © 2011-2022 走看看