• Java设计模式------策略模式


    一、定义

    策略模式(Strategy)属于对象行为型设计模式,主要是定义一系列的算法,把这些算法一个个封装成拥有共同接口的单独的类,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。这里的算法不要狭义的理解为数据结构中算法,可以理解为不同的业务处理方法。这种做法会带来什么样的好处呢?它将算法的使用和算法本身分离,即将变化的具体算法封装了起来,降低了代码的耦合度,系统业务策略的更变仅需少量修改。算法被提取出来,这样可以使算法得到重用,这种情况还可以考虑使用享元模式来共享算法对象,来减少系统开销(但要注意使用享元模式的建议条件)。

    二、结构


    先由定义来想象下它的结构吧:要使算法拥有共同的接口,这样就要实现一个接口或者一个抽象类出来才行。这样基本上轮廓也就出来了,我们来看看吧:

    策略模式由三个角色组成:
    1) 算法使用环境(Context)角色:算法被引用到这里和一些其它的与环境有关的操作一起来完成任务。

    2) 抽象策略(Strategy)角色:规定了所有具体策略角色所需的接口。在java 它通常由接口或者抽象类来实现。

    3) 具体策略(Concrete Strategy)角色:实现了抽象策略角色定义的接口。策略模式各个角色之间关系的类图表示:

    三、举例

         情景描述:医生针对不同症状的病人开除不同的处方

     1 package com.foreveross.fengshu;
     2 
     3 /**
     4  * @author fengshuzi
     5  */
     6 public class 策略模式 {
     7 
     8     public static void main(String args[]) {
     9         System.out.println("医生我感冒了");
    10         new Context(new Cold()).operate();
    11         System.out.println("医生我头疼");
    12         new Context(new Headache()).operate();
    13         System.out.println("医生我肚子疼");
    14         new Context(new Stomachache()).operate();
    15     }
    16 }
    17 
    18 //医生对症开方子
    19 class Context {
    20     public Istrategy istrategy;
    21 
    22     public Context(Istrategy istrategy) {
    23         this.istrategy = istrategy;
    24     }
    25 
    26     public void operate() {
    27         this.istrategy.treat();
    28 
    29     }
    30 
    31 }
    32 
    33 
    34 interface Istrategy {
    35     public void treat();
    36 }
    37 
    38 
    39 class Cold implements Istrategy {
    40     public void treat() {
    41         System.out.println("医生开了一个治感冒的药方");
    42     }
    43 }
    44 
    45 
    46 class Headache implements Istrategy {
    47     public void treat() {
    48         System.out.println("医生开了一个治头疼的药方");
    49     }
    50 }
    51 
    52 
    53 class Stomachache implements Istrategy {
    54     public void treat() {
    55         System.out.println("医生开了一个治肚子痛的药方");
    56     }
    57 }

    四、使用建议

    下面是使用策略模式的一些建议:
    1) 系统需要能够在几种算法中快速的切换。
    2) 系统中有一些类它们仅行为不同时,可以考虑采用策略模式来进行重构
    3) 系统中存在多重条件选择语句时,可以考虑采用策略模式来重构。但是要注意一点,策略模式中不可以同时使用多于一个的算法。



  • 相关阅读:
    org.hibernate.HibernateException: Could not obtain transactionsynchronized Session for current thread
    ajax上传文件
    iphone 图层操作
    什么是OAuth授权
    UIWebView得到加载页的title
    转iphone 动画实现方法
    c#字符串转datatime时,因操作系统不一致产生的问题解决方法
    Bold font in IPhone UILabel
    五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
    包含iphone4在内的icon,default及图片处理方法
  • 原文地址:https://www.cnblogs.com/fengshuzi/p/3512477.html
Copyright © 2020-2023  润新知