这篇文章主要知识点是关于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程序设计有所帮助。
以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。
Copyright 2018-2020 www.xz577.com 码农之家
版权投诉 / 书籍推广 / 赞助:520161757@qq.com
23种设计模式(11)java策略模式
23种设计模式第四篇:java策略模式 定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。在前面说过的行为类模式中,有一种模式也是关注对算法的封装——模版方法模式。 对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中,抽象策略Strategy一般是一个接口,目的只是为了定义规范,里面一般不包含逻辑。 其实,这只是通用实现,而在实际编程中,因为各个具体策略实现类之间难免存在一些相同的逻辑……
实例分析JavaScript设计模式之策略模式
在程序设计中,我们也常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。 这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 /* * pre:策略模式 * 示例:公司计算奖金,分A、B、C 三种绩效,计算方式如下 * 绩效为A,奖金乘以系数5 * 绩效为B,奖金乘以系数4 * 绩效为C,奖金乘以系数3 *///-------- 示例1 ----------var calculateBonus = function(performanceLevel, salary) { if(performanceLevel === A) { return salary * 5; } if(performanceLevel === B) { return salary * 4; } if(performanceLevel === C) { return salary * 3; }};console.log(calculateBonus(A, 2000));/* 缺点:1、函数体系庞大,拥有太多的if-else语句; 2、如果增加绩效D,需修改内部函数,违背封闭-开放原则; 3、复用性差,……
Java设计模式之策略模式原理与用法实例详解
本文实例讲述了Java设计模式之策略模式原理与用法。分享给大家供大家参考,具体如下: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。其中JDK里面的TreeSet类和TreeMap类就用到了策略模式。这两个类是带排序的集合类,其中排序的规则就相当于策略模式里定义的一系列算法,而集合类就相当于是策略模式里的环境类,供用户使用,用只知道TreeSet和TreeMap是带排序的,至于怎么排序的,是由排序的算法决定的。 策略模式由三部分组成:抽象策略角色,具体策略角色,环境角色。 抽象策略角色 :策略类,通常由一个接口或者抽象类实现。 具体策略角色 :实现了抽象策略类,并包装了相关的算法和行为。 环境角色 :持有一个策略类的引用,最终给客户端调用。……