1. 程式人生 > 資訊 >為了留住老客戶,美運營商紛紛拿免費蘋果 iPhone 12 做營銷

為了留住老客戶,美運營商紛紛拿免費蘋果 iPhone 12 做營銷

定義:

過濾器模式(Filter Pattern)或標準模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標準來過濾一組物件,通過邏輯運算以解耦的方式把它們連線起來。這種型別的設計模式屬於結構型模式,它結合多個標準來獲得單一標準。

類圖:

這張圖是網路摘的,基本上就是按這張圖寫的:

介面:

public interface Criteria {
    List<Person> meetCriteria(List<Person> persons);
}

各種實現類,多列舉了幾個:

public class GirlCriteria implements
Criteria{ @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> girlPersons = new ArrayList<>(); for (Person person : persons) { if(person.getGender().equals("GIRL")) { girlPersons.add(person); } }
return girlPersons; } }
public class BoyCriteria implements Criteria {
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> boyPersons = new ArrayList<>();
        for (Person person : persons) {
            if(person.getGender().equals("BOY")) {
                boyPersons.add(person);
            }
        }
        
return boyPersons; } }
public class SingleCriteria implements Criteria {
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> singlePersons = new ArrayList<>();
        for (Person person : persons) {
            if(person.getStatus().equals("SINGLE")) {
                singlePersons.add(person);
            }
        }
        return singlePersons;
    }
}
//同時滿足這兩個條件的
public class AndCriteria implements Criteria {
    private Criteria c1;
    private Criteria c2;
    public AndCriteria (Criteria c1, Criteria c2) {
        this.c1 = c1;
        this.c2 = c2;
    }

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> c1Person = c1.meetCriteria(persons);
        List<Person> andPerson = c2.meetCriteria(c1Person);
        return andPerson;
    }
}
// 滿足條件之一的
public class OrCriteria implements Criteria {
    private Criteria c1;
    private Criteria c2;

    public OrCriteria(Criteria c1, Criteria c2) {
        this.c1 = c1;
        this.c2 = c2;
    }

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> list1 = c1.meetCriteria(persons);
        List<Person> list2 = c2.meetCriteria(persons);
        for (Person person : list2) {
            if (!list1.contains(person)) {
                list1.add(person);
            }
        }
        return list1;
    }
}

測試類:

public class TestCriteria {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person("Robert", "BOY", "SINGLE"));
        persons.add(new Person("John", "BOY", "MARRIED"));
        persons.add(new Person("Laura", "GIRL", "MARRIED"));
        persons.add(new Person("Diana", "GIRL", "SINGLE"));
        persons.add(new Person("Mike", "BOY", "SINGLE"));
        persons.add(new Person("Bobby", "BOY", "SINGLE"));

        // 過濾只有BOY的
        System.out.println("boy:");
        List<Person> list1 = new BoyCriteria().meetCriteria(persons);
        printList(list1);

        // 過濾只有GIRL的
        System.out.println("girl:");
        List<Person> list2 = new GirlCriteria().meetCriteria(persons);
        printList(list2);

        // 過濾只有SINGLE的
        System.out.println("single:");
        List<Person> list3 = new SingleCriteria().meetCriteria(persons);
        printList(list3);

        // 過濾BOY並且SINGLE的
        System.out.println("boy and single:");
        BoyCriteria c1 = new BoyCriteria();
        SingleCriteria c2 = new SingleCriteria();
        List<Person> list4 = new AndCriteria(c1, c2).meetCriteria(persons);
        printList(list4);

        // 過濾GIRL或者SINGLE的
        GirlCriteria c3 = new GirlCriteria();
        SingleCriteria c4 = new SingleCriteria();
        System.out.println("girl or single:");
        List<Person> list5 = new OrCriteria(c3, c4).meetCriteria(persons);
        printList(list5);
    }

    public static void printList(List<Person> list) {
        for (Person person : list) {
            System.out.println(person);
        }
    }
}

測試結果: