Java設(shè)計模式之策略模式定義與用法詳解
本文實例講述了Java策略模式定義與用法。分享給大家供大家參考,具體如下:
一. 定義:
定義一系列算法,把他們一個一個封裝起來,并且使他們可以相互替換.
二. 優(yōu)點:
(1)上下文(Context)和具體策略(ConcreteStrategy)是松耦合關(guān)系,因此上下文只需要知道他要使用某一個實現(xiàn) Strategy接口類的實例,但不需要知道是哪個類.
(2)策略模式滿足開閉原則,當增加新的具體類時,不需要修改上下文類的代碼,上下文即可以引用新的具體策略的實例.
三. 實例:
下面就通過一個問題來詳細解釋一下策略模式.
實驗要求:
小丁是阿里巴巴公司程序員,這天項目經(jīng)理給他一個類定義
public class Worker {
int id;
String name;
int age;
}
小丁一看,這不是一個工人的定義嗎,包括編號id,姓名,年齡什么的。
經(jīng)理說,我需要你寫一個功能,能找出一批工人中年齡最大的一位。方法聲明是(或者類似)這樣的:
Worker searchWorker(List<Worker> workers);
參數(shù)List<Worker> workers是這批工人數(shù)據(jù)。如果查到了年齡最大的工人,則返回這個Worker對象。如workers沒有節(jié)點時,返回null。
答案:
1. 策略
在策略模式中,這個接口被命名為WorkStrategy (在具體問題中,這個名字可以根據(jù)具體問題命名),代碼如下:
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. 具體策略
具體策略是實現(xiàn)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("腳本之家測試結(jié)果:");
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. 運行結(jié)果:

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
Java中SimpleDateFormat日期格式轉(zhuǎn)換詳解及代碼示例
這篇文章主要介紹了Java中SimpleDateFormat日期格式轉(zhuǎn)換詳解及代碼示例,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12
Java使用Tinify實現(xiàn)圖片無損壓縮(4M無損壓縮到1M)的方法
在當今的數(shù)字化時代,圖片已成為網(wǎng)站、應(yīng)用和社交媒體中不可或缺的元素,然而,大尺寸的圖片不僅會增加頁面或者客戶端加載時間,還會占用大量的存儲空間,本文將詳細介紹如何利用Tinify壓縮圖片,并將其上傳至OSS,重點介紹圖片壓縮實現(xiàn)方式,需要的朋友可以參考下2024-08-08
關(guān)于fastjson的@JSONField注解的一些問題(詳解)
下面小編就為大家?guī)硪黄P(guān)于fastjson的@JSONField注解的一些問題(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02

