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

  • 更新时间:2020-03-19 20:34:45
  • 编辑:庄向荣
给大家整理一篇Java相关的编程文章,网友饶鸿煊根据主题投稿了本篇教程内容,涉及到Java、设计模式、策略模式、Java设计模式之策略模式定义与用法详解相关内容,已被328网友关注,涉猎到的知识点内容可以在下方电子书获得。
  • Java程序设计基础(第四版) / 7.26 MB 推荐度:
  • 《JavaScript权威指南(原书第7版)》源代码 / 4.2 MB 推荐度:
  • Java Web 项目开发案例实战 / 35.7 MB 推荐度:
  • 《HTML、CSS、JavaScript 网页制作从入门到精通》素材 / 50.7 MB 推荐度:
  • JavaScript实战 / 49.3 MB 推荐度:
  • 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相关教程

    • 关于JavaScript 原型链的一点个人理解

      本文给大家分享的是个人关于JavaScript原型链相关知识的一些理解,这里推荐给大家,希望大家能够喜欢

      发布时间:2019-07-23

    • 零基础自学Java视频,基础知识最全合集

      目前国内的软件开发行业,Java职业的占比越来越高,很多刚接触Java编程的初学者直接在网上搜索“零基础自学Java视频”,然后自己定制好学习计划后,开始对着视频学起来,一开始还觉得有点意思,慢慢的,发现离开视频什么都不会了,不知道怎么写,不知道如何利用代码实现,这是为什么?

      发布时间:2021-06-06

    用户留言