先看必要的類:
/**
* 學生類
*/
public class Student {
private String name;
private int age;
private double score_zh;//語文成績
private double score_en;//英語成績
private double score_mth;//數學成績
getter/setter方法省略
}
public class TestBefor {
//學生集合
List<Student> slist = Arrays.asList(
new Student("z3", 18, 88.8, 30.5, 99.5),
new Student("l4", 28, 88.6, 66.5, 77.5),
new Student("w5", 30, 80.8, 50.5, 89.5),
new Student("z6", 38, 50.8, 90.5, 60.5)
);
/**
* 過濾年齡超過28歲的學員
*/
@Test
public void filterAge(){
List<Student> list = new ArrayList<Student>();
for (Student student : slist) {
if(student.getAge() >=28){
list.add(student);
}
}
System.out.println(list);
}
/**
* 過濾語文分數及格的學員
*/
@Test
public void filterScore_zh(){
List<Student> list = new ArrayList<Student>();
for (Student student : slist) {
if(student.getScore_zh() > 60.0){
list.add(student);
}
}
System.out.println(list);
}
/**
* 比較以上兩種方法,只有在if條件中的判斷不一樣,就寫出了兩個方法,造成了代碼的冗餘,
* 可以使用策略模式進行優化,想要實現什麼樣的方式,就按照不同的策略進行實現
*/
}
//優化
/**
* 策略接口
*/
public interface IMyStrategy<T> {
boolean handle(T t);
}
/**
* 策略實現年齡相關處理
*/
public class MyStrategyByAgeImpl implements IMyStrategy<Student> {
public boolean handle(Student student) {
return student.getAge() >= 28;
}
}
/**
* 策略實現語文成績相關處理
*/
public class MyStrategyByScore_zhImpl implements IMyStrategy<Student>{
public boolean handle(Student student) {
return student.getScore_zh() >= 60.0;
}
}
/**
* 設計模式之策略模式
*/
public class StrategyPatternTest {
//學生集合
List<Student> slist = Arrays.asList(
new Student("z3", 18, 88.8, 30.5, 99.5),
new Student("l4", 28, 88.6, 66.5, 77.5),
new Student("w5", 30, 80.8, 50.5, 89.5),
new Student("z6", 38, 50.8, 90.5, 60.5)
);
@Test
public void test1(){
//1:這裏使用年齡進行過濾,過濾出年齡超等28的學生
List<Student> students = filter(slist, new MyStrategyByAgeImpl());
for (Student student : students) {//查看輸出結果信息
System.out.println(student);
}
System.out.println("----------------------我是分隔符----------------------");
//2:這裏使用語文分數及格的學員,以60分及格
List<Student> filter = filter(slist, new MyStrategyByScore_zhImpl());
for (Student student : filter) {
System.out.println(student);
}
}
/**
* 過濾公共方法
*/
public List<Student> filter(List<Student> slist,IMyStrategy<Student> imp){
List<Student> list = new ArrayList<Student>();
for (Student student : slist) {
if(imp.handle(student)){
list.add(student);
}
}
return list;
}
}
想要實現不同的出來時,這裏我們就可以直接創建實現類去實現接口,具體操作在實現類中進行聲明。
好處:1、避免使用多重條件判斷。 2、擴展性良好。
壞處:策略類會增多。
注意事項:如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。