设计模式(十七)---策略模式

顺蝈蝈 顺蝈蝈     2022-09-19     727

关键词:

1、简介

  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

2、策略模式的结构

  策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。

  用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。

  从上图可以看出,策略模式涉及以下三个角色

  ●     环境(Context)角色:持有一个Strategy的引用。

  ●  抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

3、源代码

  3.1、抽象策略类

package Strategy;
/**
 * ********************************************************  
* @ClassName: Strategy 
* @Description: 抽象策略类
*  
**********************************************************
 */
public interface Strategy {
     public void operate();  
}

  3.2、具体策略实现类A

package Strategy;
/**
 * ********************************************************  
* @ClassName: ConcreteStrategyA 
* @Description: 具体策略实现类
*  
**********************************************************
 */
public class ConcreteStrategyA implements Strategy{

    @Override
    public void operate() {
        System.out.println("ConcreteStrategyA");
        
    }

}

  3.3、具体策略实现类B

package Strategy;
/**
 * ********************************************************  
* @ClassName: ConcreteStrategyB
* @Description: 具体策略实现类
*  
**********************************************************
 */
public class ConcreteStrategyB implements Strategy{

    @Override
    public void operate() {
        System.out.println("ConcreteStrategyB");
        
    }

}

  3.4、具体策略实现类C

package Strategy;
/**
 * ********************************************************  
* @ClassName: ConcreteStrategyC
* @Description: 具体策略实现类
*  
**********************************************************
 */
public class ConcreteStrategyC implements Strategy{

    @Override
    public void operate() {
        System.out.println("ConcreteStrategyC");
        
    }

}

  3.5、环境类

package Strategy;
/**
 * ********************************************************  
* @ClassName: Context 
* @Description:环境类
*  
**********************************************************
 */
public class Context {
    private Strategy strategy;
    
    public Context(Strategy strategy) {
        this.strategy=strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    
     public void operate(){  
         this.strategy.operate();  
    }  
}

  3.6、测试客户端

package Strategy;
/**
 * ********************************************************  
* @ClassName: Client 
* @Description: 策略模式测试客户端
*  
**********************************************************
 */
public class Client {

    public static void main(String[] args) {
        Context context;  
          
         System.out.println("----------第一次调用---------------");  
         context = new Context(new ConcreteStrategyA());  
         context.operate();  
         System.out.println("\n");  
      
         System.out.println("----------第二次调用---------------");  
         context.setStrategy(new ConcreteStrategyB());  
         context.operate();  
         System.out.println("\n");  
      
         System.out.println("----------第三次调用---------------");  
         context.setStrategy(new ConcreteStrategyC());  
         context.operate();  
         System.out.println("\n");  
    }

}

4、测试,运行结果如下

5、总结 

  策略模式的重心

  策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。

  算法的平等性

  策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。

  所有的策略算法在实现上也是相互独立的,相互  之间是没有依赖的。

  所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

  运行时策略的唯一性

  运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。

  公有的行为

  经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。

  这其实也是典型的将代码向继承等级结构的上方集中的标准做法。

  

策略模式的优点

  (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

  (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,

      比使用继承的办法还要原始和落后。

策略模式的缺点

  (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

设计模式——十七:装饰器模式(代码片段)

@目录什么是装饰器模式?为什么要用装饰器模式使用装饰器模式前引入装饰器模式装饰器模式优缺点装饰器模式优点装饰器模式缺点装饰器模式应用场景扩展-Java中的装饰器模式什么是装饰器模式?装饰器模式的定义:Attachadditi... 查看详情

设计模式(十七)——模板方法模式

1.描述定义一个操作中算法的骨架,而将一些步骤延伸到子类当中。模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。2.模式的使用·抽象模板(AbstractTemplate):抽象模板是一个抽象类。抽象模板定义若... 查看详情

设计模式学习笔记(十七:状态模式)

1.1概述  允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。这就是状态模式的定义。  一个对象的状态依赖于它的变量的取值情况,对象在不同的运行环境中,可能具有不同的状态。... 查看详情

23种设计模式(十七)——状态模式状态变化

状态模式文章目录状态模式意图什么时候使用状态真实世界类比状态模式的实现状态模式的优缺点亦称:State意图对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其... 查看详情

设计模式(十七):备忘录模式

一、概述   现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数... 查看详情

责任链模式职责链模式chainofresponsibilitypattern行为型设计模式(十七)(代码片段)

责任链模式(ChainofResponsibilityPattern)职责链模式意图使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系将这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 责任链... 查看详情

学习笔记第十七节课

进入编辑模式。编辑模式就是进入一个可以编辑文本文档的模式。i是进入编辑模式,同样shift+i也可以,而且shift+i可以直接把光标定位到行首进去编辑模式。o也可以进去编辑模式,是在所在行的下一行进去编辑模式。也就是相... 查看详情

软件设计模式学习(十七)职责链模式(代码片段)

系统中如果存在多个对象可以处理一个同一请求,可以通过职责链模式将这些处理请求的对象连成一条链,让请求沿着该链进行传递。如果链上的对象可以处理该请求则进行处理,否则将请求转发给下家处理模式动机很多情况下... 查看详情

软件设计模式学习(二十七)访问者模式(代码片段)

访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素具有不同的类型,且不同的访问者可以对其进行不同的访问操作模式动机对于系统中某些对象,它们存储在同一个... 查看详情

第十七讲命令模式

1.定义Command模式也叫命令模式,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。2.命令模式的应用场景在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调... 查看详情

(十七)迭代器模式详解(foreach的精髓)(代码片段)

...Z的身份和各位对话了,前段时间为了更加逼真的解释设计模式,LZ费尽心思给设计模式加入了故事情节,本意是为了让各位在看小说的过程中就可以接触到设计模式,不过写 查看详情

设计模式—策略模式

策略模式主要内容:策略模式是什么?策略模式解决了什么问题?如何实现策略模式?实际应用中的策略模式。1.策略模式是什么?定义:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化... 查看详情

学习十七

四周第二次课(2月27日)5.1vim介绍5.2vim颜色显示和移动光标5.3vim一般模式下移动光标5.4vim一般模式下复制、剪切和粘贴VIM介绍安装完之后会提示vim已安装vim打开文本是会出现这种有颜色的一般模式就直接esc进入编辑模式可以按i... 查看详情

美学心得(第一百八十七集)罗国正

美学心得(第一百八十七集)罗国正(2018年4月) 2693、这四种思维和生活的模式,从古至今都在深刻地影响着世界,就是:超自然的宗教模式;科学的模式;人文主义的模式;自给自足随遇而活的模式。文艺复兴虽然是多因... 查看详情

设计模式---策略模式(代码片段)

...f0c;每一条途径对应一种算法,此时我们可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增加新的解决途径。策略模式包含角色Contex 查看详情

java设计模式---策略模式(案例解析)

策略模式一、概念1、理解策略模式策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一个行为接口和具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一... 查看详情

十七vim介绍vim颜色显示和移动光标vim一般模式下移动光标vim一般模式下复制剪切和粘

十七、vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、vim一般模式下复制、剪切和粘贴一、vim介绍vim:vi的升级版,区别就是:vi在编辑文本时不会显示颜色,而vim会。它的配置文件:/etc/vimrc、一些高级的功能可在这... 查看详情

设计模式-策略模式

策略模式(strategypattern)策略模式(strategypattern):策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的... 查看详情