本文實例講述了Java策略模式定義與用法。分享給大家供大家參考,具體如下:
一. 定義:
定義一系列算法,把他們一個一個封裝起來,并且使他們可以相互替換.
二. 優(yōu)點:
(1)上下文(Context)和具體策略(ConcreteStrategy)是松耦合關(guān)系,因此上下文只需要知道他要使用某一個實現(xiàn) Strategy接口類的實例,但不需要知道是哪個類.
(2)策略模式滿足開閉原則,當(dāng)增加新的具體類時,不需要修改上下文類的代碼,上下文即可以引用新的具體策略的實例.
三. 實例:
下面就通過一個問題來詳細(xì)解釋一下策略模式.
實驗要求:
小丁是阿里巴巴公司程序員,這天項目經(jīng)理給他一個類定義
1
2
3
4
5
|
public class Worker { int id; String name; int age; } |
小丁一看,這不是一個工人的定義嗎,包括編號id,姓名,年齡什么的。
經(jīng)理說,我需要你寫一個功能,能找出一批工人中年齡最大的一位。方法聲明是(或者類似)這樣的:
1
|
Worker searchWorker(List<Worker> workers); |
參數(shù)List<Worker> workers
是這批工人數(shù)據(jù)。如果查到了年齡最大的工人,則返回這個Worker對象。如workers沒有節(jié)點時,返回null。
答案:
1. 策略
在策略模式中,這個接口被命名為WorkStrategy (在具體問題中,這個名字可以根據(jù)具體問題命名),代碼如下:
WorkStrategy .java
1
2
3
4
|
import java.util.List; public interface WorkStrategy { public Worker AgeAverage(List<Worker> list); } |
2. 上下文
上下文面向策略,既是面向接口的類;代碼如下:
MaxAge.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
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( "服務(wù)器之家測試結(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程序設(shè)計有所幫助。
原文鏈接:http://blog.csdn.net/yang_tang/article/details/78240531