是否可以用策略模式這麼優化

先看必要的類:

/**
 * 學生類
 */
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、擴展性良好。

壞處:策略類會增多。

注意事項:如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章