您好,登錄后才能下訂單哦!
這篇文章給大家介紹Java中策略模式如何使用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
一. 定義:
定義一系列算法,把他們一個(gè)一個(gè)封裝起來(lái),并且使他們可以相互替換.
二. 優(yōu)點(diǎn):
(1)上下文(Context)和具體策略(ConcreteStrategy)是松耦合關(guān)系,因此上下文只需要知道他要使用某一個(gè)實(shí)現(xiàn) Strategy接口類(lèi)的實(shí)例,但不需要知道是哪個(gè)類(lèi).
(2)策略模式滿(mǎn)足開(kāi)閉原則,當(dāng)增加新的具體類(lèi)時(shí),不需要修改上下文類(lèi)的代碼,上下文即可以引用新的具體策略的實(shí)例.
三. 實(shí)例:
下面就通過(guò)一個(gè)問(wèn)題來(lái)詳細(xì)解釋一下策略模式.
實(shí)驗(yàn)要求:
小丁是阿里巴巴公司程序員,這天項(xiàng)目經(jīng)理給他一個(gè)類(lèi)定義
public class Worker { int id; String name; int age; }
小丁一看,這不是一個(gè)工人的定義嗎,包括編號(hào)id,姓名,年齡什么的。
經(jīng)理說(shuō),我需要你寫(xiě)一個(gè)功能,能找出一批工人中年齡最大的一位。方法聲明是(或者類(lèi)似)這樣的:
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. 上下文
上下文面向策略,既是面向接口的類(lèi);代碼如下:
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接口的類(lèi),即必須重寫(xiě)接口中的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 } }
關(guān)于Java中策略模式如何使用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。