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

时间:2021-05-20

本文实例讲述了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操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章