当前位置:主页 > java教程 > Java设计模式之策略模式定义与用法详解

详解Java策略模式定义与用法

发布:2020-03-19 20:34:45 103


我们帮大家精选了Java相关的编程文章,网友蒲熠彤根据主题投稿了本篇教程内容,涉及到Java、设计模式、策略模式、Java设计模式之策略模式定义与用法详解相关内容,已被700网友关注,下面的电子资料对本篇知识点有更加详尽的解释。

Java设计模式之策略模式定义与用法详解

本文实例讲述了Java策略模式定义与用法。分享给大家供大家参考,具体如下:

一. 定义:

定义一系列算法,把他们一个一个封装起来,并且使他们可以相互替换.

二. 优点:

(1)上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系,因此上下文只需要知道他要使用某一个实现  Strategy接口类的实例,但不需要知道是哪个类.
(2)策略模式满足开闭原则,当增加新的具体类时,不需要修改上下文类的代码,上下文即可以引用新的具体策略的实例.

三. 实例:

下面就通过一个问题来详细解释一下策略模式.

实验要求:

小丁是阿里巴巴公司程序员,这天项目经理给他一个类定义

public class Worker {
  int id;
  String name;
  int age;
}

小丁一看,这不是一个工人的定义吗,包括编号id,姓名,年龄什么的。

经理说,我需要你写一个功能,能找出一批工人中年龄最大的一位。方法声明是(或者类似)这样的:

Worker searchWorker(List<Worker> workers);

参数List<Worker> workers是这批工人数据。如果查到了年龄最大的工人,则返回这个Worker对象。如workers没有节点时,返回null。
答案:

1. 策略

在策略模式中,这个接口被命名为WorkStrategy (在具体问题中,这个名字可以根据具体问题命名),代码如下:

WorkStrategy .java

import java.util.List;
public interface WorkStrategy {
  public Worker AgeAverage(List<Worker> list);
}

2. 上下文

上下文面向策略,既是面向接口的类;代码如下:

MaxAge.java

import java.util.List;
public class MaxAge {
  WorkStrategy workstrategy;
  public void SetWorkStrategy(WorkStrategy workstrategy){
    this.workstrategy=workstrategy;
  }
  public Worker getFindMax(List<Worker> list){
    if(workstrategy!=null)
      return workstrategy.AgeAverage(list);
    else{
      return null;
    }
  }
}

3. 具体策略

具体策略是实现WorkStrategy接口的类,即必须重写接口中的abstract Worker
AgeAverage(List<Worker> list)方法

代码如下:

StrategyMaxAge.java

import java.util.List;
public class StrategyMaxAge implements WorkStrategy{
  @Override
  public Worker AgeAverage(List<Worker> list) {
    int fs[] = new int[list.size()];
    int maxage = 0;
    for (int j = 0; j < list.size(); j++) {
      fs[j]=list.get(j).getAge();
      if (fs[maxage] <= fs[j]) {
        maxage = j;
      }
    }
    return list.get(maxage);
  }
}

4. 策略模式的使用

Application.java

import java.util.ArrayList;
import java.util.List;
public class Application {
  public static void main(String[] args) {
    List<Worker> list = new ArrayList<>();
    list.add(new Worker(1, "张三", 30));
    list.add(new Worker(2, "李四", 40));
    list.add(new Worker(3, "王五", 33));
    MaxAge findage = new MaxAge();
    findage.SetWorkStrategy(new StrategyMaxAge());
    Worker findw = findage.getFindMax(list);
    System.out.println("码农之家测试结果:");
    System.out.println("年龄最大的工人:"+findw.getId()+" "+findw.getName()+" "+findw.getAge());
  }
}
class Worker{
  int id;
  String name;
  int age;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age =age;
  }
  public Worker(int id, String name, int age) {
    super();
    this.id = id;
    this.name = name;
    this.age = age;
  }
  public Worker() {
    super();
    // TODO Auto-generated constructor stub
  }
}

5. 运行结果:

Java设计模式之策略模式定义与用法详解

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


参考资料

相关文章

  • Java ArrayList源码深入分析

    发布:2023-03-03

    ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList,并实现了List接口


  • java bootclasspath的具体用法

    发布:2023-03-10

    本文主要介绍了java bootclasspath的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • Java微信公众平台之群发接口(高级群发)

    发布:2022-10-18

    为网友们分享了关于Java的教程,这篇文章主要为大家详细介绍了Java微信公众平台之群发接口,高级群发功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • java解决分布式环境中高并发环境下数据插入重复问题

    发布:2019-06-28

    这篇文章主要介绍了java解决并发数据重复问题 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • Java创建型模式之建造者模式详解

    发布:2023-03-30

    建造者模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。本文将通过示例讲解建造者模式,需要的可以参考一下


  • java实现基于opencv全景图合成实例

    发布:2019-06-24

    全景图相信大家应该都不陌生,下面这篇文章主要给大家介绍了关于java如何实现基于opencv全景图合成的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编


  • javascript自由编辑图片示例代码

    发布:2020-03-13

    这篇文章主要介绍了javascript实现自由编辑图片代码详解,在当下的的前端项目中,图片功能可以说是非常常见的,图片的展示、图片的裁剪编辑、图片的上传等,那么我们的项目便来了个需求


  • Java多线程实战之交叉打印的两种方法

    发布:2022-10-21

    给网友们整理关于Java的教程,今天小编就为大家分享一篇关于Java多线程实战之交叉打印的两种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧


网友讨论