首页 > 其他分享 >策略模式

策略模式

时间:2023-03-23 16:15:07浏览次数:32  
标签:策略 System 模式 Strategy println operate public out

在开发中经常遇到这种情况,实现某个功能有多种算法策略,我们可以根据不同环境或者条件选择不同的算法策略来完成该功能,比如查找、排序等。
一种常用方式是硬编码在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过 if-else 或者 case 等条件判断语句来进行选择。但是如果需要增加新的算法策略,就需要修改封装算法类的源代码,并且在这个类中封装了大量算法方法,也会使得该类代码较复杂,维护较为困难。

将类中经常改变或者可能改变的部分提取为作为一个抽象策略接口类,然后在类中包含这个接口类的实例,利用多态使得具体策略实现类可以根据不同的场景表现出不同的行为,这就是策略模式。
e13339f5eaae451e8094df888f957606_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E3NDUyMzM3MDA=,size_16,color_FFFFFF,t_70.png

  • 环境类(Context):通过 ConcreteStrategy 具体策略类来配置,持有 Strategy 对象并维护对Strategy 对象的引用。可定义一个接口来让 Strategy 访问它的数据。
  • 抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy 定义的算法。
  • 具体策略类(ConcreteStrategy): Strategy 接口的具体算法。

策略模式实例

场景:刘备去江东娶亲,走之前诸葛亮给赵云三个锦囊妙计,让他在不同时间不同情况下拆开就能解决当时的问题。
场景中三个要素:不同情况(环境类,持有对锦囊(抽象策略)的引用)、锦囊(抽象策略类)、具体情况对应的锦囊(具体策略类)
锦囊(抽象策略类)

public interface Strategy {
     public void operate();
}

具体情况下使用的锦囊(具体策略类)

//妙计一:初到吴国
public class BackDoor implements IStrategy {
     @Override
     public void operate() {
          System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");
     }
}
 
//求吴国太开绿灯放行
public class GivenGreenLight implements IStrategy {
     @Override
     public void operate() {
          System.out.println("求吴国太开个绿灯,放行");
     }
}
 
//孙夫人断后,挡住追兵
public class BlackEnemy implements IStrategy {
     @Override
     public void operate() {
          System.out.println("孙夫人断后,挡住追兵");
     }
}

不同情况(环境类)

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();
     }
}

测试

public class Zhaoyun {
 
  public static void main(String[] args) {
     Context context;
 
     System.out.println("----------刚到吴国使用第一个锦囊---------------");
     context = new Context(new BackDoor());
     context.operate();
     System.out.println("\n");
 
     System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------");
     context.setStrategy(new GivenGreenLight());
     context.operate();
     System.out.println("\n");
 
     System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");
     context.setStrategy(new BlackEnemy());
     context.operate();
     System.out.println("\n");
     }
}

标签:策略,System,模式,Strategy,println,operate,public,out
From: https://www.cnblogs.com/woshi/p/17247820.html

相关文章

  • 代理模式
    代理模式通过代理对象来访问真实对象,相当于对真实对象进行了封装操作。Subject:真实对象和代理对象的共同接口;Proxy:代理对象,实现了与真实对象相同的接口,所以在任何时刻都......
  • 单例模式
    单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。单例模式的优点在于:系......
  • 策略路由
          ......
  • java-策略模式的简单应用
    我以我在实际项目中的应用举例场景如下:MQTT收到消息之后,根据不同的标识(operator)去进行不同的处理1.新建接口MqttCallBackService<T> publicinterfaceMqttCallBackSe......
  • PXE批量装系统之GHO恢复模式针对同型号同批次机器网络装机
    PXE批量装系统之GHO恢复模式针对同型号同批次机器网络装机1.引入预启动执行环境(PrebooteXecutionEnvironment,PXE)也被称为预执行环境,提供了一种使用[网络接口NetworkIn......
  • js策略模式 以及 es6中 ?? 的用法
    策略模式,es6中??的用法constjudge=function(status){ constmap=[ 0:'普通用户', 1:'管理员', 2:'超级管理员' ] returnmap[status]??'未知用......
  • selenium 设置chrom手机模式
      https://blog.csdn.net/qq_42623386/article/details/123391709 fromseleniumimportwebdriverfromselenium.webdriver.chrome.optionsimportOptionsfrom......
  • Linux 网络配置 ---桥接模式---最简单的方法!!!
    1.桥接模式(Bridged)VMware桥接模式,也就是将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部......
  • 策略模式与模版模式的区别与应用
    本文为博主原创,未经允许不得转载:最近在做项目的优化,由于项目在早期缺乏规划,在开发过程中,对于某一个业务的不同类型判断,增加了很多if else,代码的健壮性变得很差。所以......
  • 20.(行为型模式)java设计模式之迭代器模式
    一、什么是迭代器模式(IteratorPattern)   提供—种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部实现,属于行为型模式。应用场景:   —般来说,迭......