Java設(shè)計(jì)模式之策略模式定義與用法詳解
本文實(shí)例講述了Java策略模式定義與用法。分享給大家供大家參考,具體如下:
一. 定義:
定義一系列算法,把他們一個(gè)一個(gè)封裝起來(lái),并且使他們可以相互替換.
二. 優(yōu)點(diǎn):
(1)上下文(Context)和具體策略(ConcreteStrategy)是松耦合關(guān)系,因此上下文只需要知道他要使用某一個(gè)實(shí)現(xiàn) Strategy接口類的實(shí)例,但不需要知道是哪個(gè)類.
(2)策略模式滿足開閉原則,當(dāng)增加新的具體類時(shí),不需要修改上下文類的代碼,上下文即可以引用新的具體策略的實(shí)例.
三. 實(shí)例:
下面就通過(guò)一個(gè)問(wèn)題來(lái)詳細(xì)解釋一下策略模式.
實(shí)驗(yàn)要求:
小丁是阿里巴巴公司程序員,這天項(xiàng)目經(jīng)理給他一個(gè)類定義
public class Worker { int id; String name; int age; }
小丁一看,這不是一個(gè)工人的定義嗎,包括編號(hào)id,姓名,年齡什么的。
經(jīng)理說(shuō),我需要你寫一個(gè)功能,能找出一批工人中年齡最大的一位。方法聲明是(或者類似)這樣的:
Worker searchWorker(List<Worker> workers);
參數(shù)List<Worker> workers
是這批工人數(shù)據(jù)。如果查到了年齡最大的工人,則返回這個(gè)Worker對(duì)象。如workers沒(méi)有節(jié)點(diǎn)時(shí),返回null。
答案:
1. 策略
在策略模式中,這個(gè)接口被命名為WorkStrategy (在具體問(wèn)題中,這個(gè)名字可以根據(jù)具體問(wèn)題命名),代碼如下:
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. 具體策略
具體策略是實(shí)現(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("腳本之家測(cè)試結(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. 運(yùn)行結(jié)果:
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
springboot 在ftl頁(yè)面上使用shiro標(biāo)簽的實(shí)例代碼
這篇文章主要介紹了springboot 在ftl頁(yè)面上使用shiro標(biāo)簽的實(shí)例代碼,通過(guò)文字說(shuō)明結(jié)合實(shí)例的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧2018-05-05Spring聲明式事務(wù)@Transactional注解實(shí)現(xiàn)元數(shù)據(jù)驅(qū)動(dòng)的事務(wù)管理
這篇文章主要為大家介紹了Spring聲明式事務(wù)@Transactional注解實(shí)現(xiàn)元數(shù)據(jù)驅(qū)動(dòng)的事務(wù)管理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Java并發(fā)中線程封閉知識(shí)點(diǎn)詳解
在本篇文章里我們給大家整理了關(guān)于Java并發(fā)中線程封閉的知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友們學(xué)習(xí)參考下。2019-07-07Java實(shí)現(xiàn)文件上傳與文件下載的示例代碼
在開發(fā)中項(xiàng)目難免會(huì)遇到文件上傳和下載的情況,這篇文章主要為大家詳細(xì)介紹了Java中實(shí)現(xiàn)文件上傳與文件下載的示例代碼,希望對(duì)大家有所幫助2023-07-07Java如何對(duì)方法進(jìn)行調(diào)用詳解
今天給大家整理了Java如何對(duì)方法進(jìn)行調(diào)用,文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06Java實(shí)現(xiàn)五子棋網(wǎng)絡(luò)版
這篇文章主要為大家詳細(xì)介紹了基于Java編寫的網(wǎng)絡(luò)五子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03JAVA超級(jí)簡(jiǎn)單的爬蟲實(shí)例講解
下面小編就為大家?guī)?lái)一篇JAVA超級(jí)簡(jiǎn)單的爬蟲實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10