欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-19 23:47:12
本文实例讲述了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程序设计有所帮助。