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操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。