Java设计模式 (8) 过滤器

 /**
 * 设计模式(8)
 * 过滤器模式
 *
 * 这个模式无非就是把一个实现类,增加一个(或多个)漏斗类实现过滤某些条件而已
 *
 * 该模式的原理是将对象使用常规过滤手段进行重新组合
 * 与建造模式有相似点,但不同的是该模式更善于用在多个相同对象的时候
 *
 */

//
// 仍然使用宠物商店的例子
//
// 宠物狗的实现类
//
class Dog  {
    private String gender;
    private int price;

    public Dog(String gender,int price) {
        this.gender = gender;
        this.price = price;
    }

    public int getPrice() {
        return price;
    }

    public String getGender() {
        return gender;
    }
}

//
// 过滤类重组接口与实现类
//
interface DogFilter {
    List<Dog> run(List<Dog> dogs);
}

// 从一组狗中过滤出便宜的 < 100  并放入List中返回
class CheapDog implements DogFilter {
    @Override
    public List<Dog> run(List<Dog> dogs) {
        List<Dog> cheapDos = new ArrayList<>();
        for(Dog dog : dogs) {
            if(dog.getPrice() < 100)
                cheapDos.add(dog);
        }
        return cheapDos;
    }
}

// 从一组狗中获取出母狗 -. -  并放入List中返回
class BitchDog implements DogFilter {

    @Override
    public List<Dog> run(List<Dog> dogs) {
        List<Dog> cheapDos = new ArrayList<>();
        for(Dog dog : dogs) {
            if(dog.getGender() == "female")
                cheapDos.add(dog);
        }
        return cheapDos;
    }
}




// 测试
// Test Filter Pattern
public class main {

    public static void printDogs(List<Dog> dogs) {
        for(Dog dog : dogs) {
            System.out.printf("price=%d [%s]\n",dog.getPrice(),dog.getGender());
        }
    }

    public static void main(String[] argv) {
        // 先拿出四只狗测试一下
        List<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog("female",120));
        dogs.add(new Dog("female",80));
        dogs.add(new Dog("male",200));
        dogs.add(new Dog("male",60));

        // 看看廉价狗有几只
        printDogs( new CheapDog().run(dogs) );
        /* 输出:
        price=80 [female]
        price=60 [male]
        */

        // 看看母狗有几只
        printDogs( new BitchDog().run(dogs) );
        /* 输出:
        price=120 [female]
        price=80 [female]
        */
    }
}

转载于:https://my.oschina.net/tasker/blog/813268

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值