这篇文章给大家介绍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
}
}
关于Java中策略模式如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。