[Design Pattern] Filter Pattern 简单案例

Filter Pattern,即过滤模式,通过不同的过滤标准,或者低耦合将过滤标准组合在一起,对一组对象进行过滤,属于结构类的设计模式。

下面是一个过滤模式的简单案例。

Criteria 定义过滤接口,CriteriaFemale, CriteriaMale, AndCriteria, OrCriteria 类实现过滤接口。Person 是被过滤的对象。CriteriaPatternDemo 演示过滤模式。

具体代码:

过滤对象 Person 的实现

public class Person {
    private String name;
    private String gender;
    private String maritalStatus;

    public Person(String name, String gender, String maritalStatus){
        this.name = name;
        this.gender = gender;
        this.maritalStatus = maritalStatus;
    }

    public String getName() {
        return name;
    }

    public String getGender() {
        return gender;
    }

    public String getMaritalStatus() {
        return maritalStatus;
    }

    public String toString(){
        return "name : " + this.name + ", gender : " + this.gender + ", maritalStatus : " + this.maritalStatus;
    }
}

过滤接口定义

import java.util.List;

public interface Criteria {

    public List<Person> meetCriteria(List<Person> persons);
}

CriteriaFemal, CriteriaMale, CriteriaSingle 具体类实现 Criteria 接口,实现过滤具体逻辑

import java.util.LinkedList;
import java.util.List;

public class CriteriaFemale implements Criteria {

    @Override
    public List<Person> meetCriteria(List<Person> persons) {

        List<Person> meetPersons = new LinkedList<>();
        for (Person p : persons){
            if ("female".equals(p.getGender())){
                meetPersons.add(p);
            }
        }
        return meetPersons;
    }
}
import java.util.LinkedList;
import java.util.List;

public class CriteriaMale implements Criteria {

    @Override
    public List<Person> meetCriteria(List<Person> persons) {

        List<Person> meetPersons = new LinkedList<>();
        for (Person p : persons){
            if ("male".equals(p.getGender())){
                meetPersons.add(p);
            }
        }
        return meetPersons;
    }

}
import java.util.LinkedList;
import java.util.List;

public class CriteriaSingle implements Criteria {

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> meetPersons = new LinkedList<>();
        for (Person p : persons){
            if ("single".equals(p.getMaritalStatus())){
                meetPersons.add(p);
            }
        }
        return meetPersons;
    }
}

AndCriteria, OrCriteria 基于基本过滤具体,进行逻辑运算

import java.util.List;

public class AndCriteria implements Criteria {

    private Criteria criteria;
    private Criteria otherCriteria;

    public AndCriteria(Criteria criteria, Criteria otherCriteria){
        this.criteria = criteria;
        this.otherCriteria = otherCriteria;
    }

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> meetPersons = criteria.meetCriteria(persons);
        meetPersons = otherCriteria.meetCriteria(meetPersons);
        return meetPersons;
    }
}
import java.util.List;

public class OrCriteria implements Criteria {

    private Criteria criteria;
    private Criteria otherCriteria;

    public OrCriteria(Criteria criteria, Criteria otherCriteria){
        this.criteria = criteria;
        this.otherCriteria = otherCriteria;
    }

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> meetPersons1 = criteria.meetCriteria(persons);
        List<Person> meetPersons2 = otherCriteria.meetCriteria(persons);

        for (Person p : meetPersons2){
            if (!meetPersons1.contains(p)){
                meetPersons1.add(p);
            }
        }
        return meetPersons1;
    }
}

演示代码,对一系列对象,进行单条件过滤,或者组合条件过滤

import java.util.LinkedList;
import java.util.List;

public class CriteriaPatternDemo {

    public static void main(){
        List<Person> persons = new LinkedList<>();
        persons.add(new Person("Mike", "male", "single"));
        persons.add(new Person("Lucy", "female", "married"));
        persons.add(new Person("Vivi", "female", "single"));
        persons.add(new Person("Eric", "male", "married"));
        persons.add(new Person("Lisa", "female", "single"));

        System.out.println("male :");
        Criteria criteriaMale = new CriteriaMale();
        CriteriaPatternDemo.printListPerson(criteriaMale.meetCriteria(persons));

        System.out.println("female :");
        Criteria criteriaFemale = new CriteriaFemale();
        CriteriaPatternDemo.printListPerson(criteriaFemale.meetCriteria(persons));

        System.out.println("sinlge female :");
        Criteria criterSingle = new CriteriaSingle();
        Criteria singleFemale = new AndCriteria(criterSingle, criteriaFemale);
        CriteriaPatternDemo.printListPerson(singleFemale.meetCriteria(persons));

        System.out.println("sinlge or female :");
        Criteria singleOrFemale = new OrCriteria(criteriaFemale, criterSingle);
        CriteriaPatternDemo.printListPerson(singleOrFemale.meetCriteria(persons));

    }

    public static void printListPerson(List<Person> persons){
        for (Person p : persons){
            System.out.println("[" + p + "]");
        }
        System.out.println("");
    }
}

拓展性考虑

例如,要增加一个过滤标准 married

1. 增加一个文件定义 CriteriaMarried 类,使其实现 Criteria 接口,实现过滤逻辑 meetCriteria()

2. 在客户端 CriteriaPatternDemo 使用新增的类 CriteriaMarried

既可使用新扩展的过滤标准。

参考资料

Design Patterns - Filter Pattern, TutorialsPoint

时间: 2024-10-19 15:55:57

[Design Pattern] Filter Pattern 简单案例的相关文章

[Design Pattern] Facde Pattern 简单案例

Facade Pattern, 即外观模式,用于隐藏复杂的系统内部逻辑,提供简洁的接口给客户端调用,属于结构类的设计模式.我会将其名字理解为,门户模式. 下面是 Facade Pattern 的一个简单案例. Shape 定义一个接口,Circle, rectangle, Square 分别实现 Shape 接口,代表系统内部的一个功能.ShapeMaker 作为一个对外类,提供简洁的接口给外部调用. 代码实现: Shape 接口 public interface Shape { public

[Design Pattern] Mediator Pattern 简单案例

Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例. ChatRoom 提供公用发送短信的方法.User 全部通过 ChatRoom 类发送信息进行沟通.MediatorPatternDemo 演示调解模式. 代码实现 ChatRoom 提供发送信息的方法 public class ChatRoom { public static void sho

[Design Pattern] Iterator Pattern 简单案例

Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单案例. Iterator 定义了迭代接口, 仅 hasNext 和 next 两个方法.Container 定义了集合的接口,必须包含一个返回迭代器类 Iterator 的方法.NameRepository 是容器的具体类,实现 Container 接口,并拥有一个内部类 NameIterator

[Design Pattern] Observer Pattern 简单案例

Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer 定义观察者的接口,定义需要观察的对象,已经被通知的接口.BinaryObserver, OctalObserver, HexaObserver 各自实现了 Observer 接口. Subject 是被观察的对象,记录了观察该对象的观察者列表,自身有变动,即可通知观察者列表中的各个观察者. 代码实现

[Design Pattern] Command Pattern 简单案例

Command Pattern, 即命令模式,把一个命令包裹在一个对象里面,将命令对象传递给命令的执行方,属于行为类的设计模式 下面是命令模式的一个简单案例. Stock 代表被操作的对象.Order 定义命令的接口,BuyStock, SellStock 是具体类,实现 Order 接口.Broker 是命令的执行方.CommandPatternDemo 演示命令模式. 代码实现 Order, 命令接口 public interface Order { public void execute(

[Design Pattern] Proxy Pattern 简单案例

Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage, ProxyImage 都实现该接口.RealImage 具有真正显示功能,ProxyImage 作为代表,暴露给客户端使用. 代码实现: public interface Image { public void display(); } RealImage 的实现,提供真正的功能 public

[Design Pattern] Flywight Pattern 简单案例

Flywight Pattern, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已有的对象,通过修改部分属性重新使用,避免申请大量内存. 本模式需要主要两个点: 1. 对象的 key 应该是不可变得,本例中 color 作为 key,所以我在 color 前添加了 final 的修饰符. 2. 并非线程安全,多个线程同时获取一个对象,并同时修改其属性,会导致无法预计的结果. 代码

[Design Pattern] Front Controller Pattern 简单案例

Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请求分发到对于的处理者. 前端控制器模式主要涉及下面三个角色 前端控制器(Front Controller) - 一个处理器用于处理全部的用户请求 分发器(Dispatcher) - 把处理后的请求分发到对于的业务处理程序 视图(View) - 真正处理请求业务程序 下面是前端控制器的一个简单案例.

[Design Pattern] Adapter Pattern 简单案例

Adapter Pattern, 即适配器模式,用于连接两个不兼容的接口,属于结构类的设计模式. 或者叫做,转换器模式. 下面是一个转换器模式简单案例. 假设已有 AudioPlayer 专门播放 mp3 格式文件,VlcPlayer 和 Mp4Player 是高级播放器,分别播放 vlc 和  mp4 格式文件,客户端代码调用 AudioPlayer 来播放 mp3 格式的文件. 此时,不想修改 AudioPlayer 和 AdvanceMediaPlayer 的接口,也不希望修改客户端 Ad