规范模式【其他模式】

规范模式

@Slf4j
public class Specification {
    /**
     * 规范模式:
     * Specification pattern separates the statement of how to match a candidate,
     * from the candidate object that it is matched against.
     * As well as its usefulness in selection,
     * it is also valuable for validation and for building to order.
     *  规范模式将如何匹配目标的代码从匹配目标中分离出来。
     *  规范模式在选择、验证和构建顺序时都很有用。
     */
    @Test
    public void all() {
        final List<Creature> creatures = Arrays.asList(new Goblin(), new Dragon(), new Shark(), new KillerBee());

        log.info("Find all walking creatures");
        final List<Creature> walkingCreatures = creatures.stream().filter(MovementSelector.of(Movement.WALKING))
                .collect(Collectors.toList());
        walkingCreatures.stream().forEach(c -> log.info(c.toString()));

        log.info("Find all dark creatures");
        final List<Creature> darkCreatures = creatures.stream().filter(ColorSelector.of(Color.DARK))
                .collect(Collectors.toList());
        darkCreatures.stream().forEach(c -> log.info(c.toString()));

        log.info("Find all red and flying creatures");
        final List<Creature> redAndFlyingCreatures = creatures.stream()
                .filter(ColorSelector.of(Color.RED).and(MovementSelector.of(Movement.FLYING)))
                .collect(Collectors.toList());
        redAndFlyingCreatures.stream().forEach(c -> log.info(c.toString()));
    }
}

interface Creature {
    String getName();

    Size getSize();

    Movement getMovement();

    Color getColor();
}

@AllArgsConstructor
@Getter
enum Color {
    DARK("dark"), LIGHT("light"), GREEN("green"), RED("red");
    private String title;
}

@AllArgsConstructor
@Getter
enum Movement {
    WALKING("walking"), SWIMMING("swimming"), FLYING("flying");
    private String title;
}

@AllArgsConstructor
@Getter
enum Size {
    SMALL("small"), NORMAL("normal"), LARGE("large");
    private String title;
}

@AllArgsConstructor
@ToString
abstract class AbstractCreature implements Creature {
    private final String name;
    private final Size size;
    private final Movement movement;
    private final Color color;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public Size getSize() {
        return size;
    }

    @Override
    public Movement getMovement() {
        return movement;
    }

    @Override
    public Color getColor() {
        return color;
    }
}

class Dragon extends AbstractCreature {
    public Dragon() {
        super("Dragon", Size.LARGE, Movement.FLYING, Color.RED);
    }
}

class Goblin extends AbstractCreature {

    public Goblin() {
        super("Goblin", Size.SMALL, Movement.WALKING, Color.DARK);
    }
}

class KillerBee extends AbstractCreature {

    public KillerBee() {
        super("KillerBee", Size.SMALL, Movement.FLYING, Color.LIGHT);
    }
}

class Shark extends AbstractCreature {

    public Shark() {
        super("Shark", Size.NORMAL, Movement.SWIMMING, Color.LIGHT);
    }
}

@Value(staticConstructor = "of")
class ColorSelector implements Predicate<Creature> {
    private final Color c;

    @Override
    public boolean test(Creature t) {
        return t.getColor().equals(c);
    }
}

@Value(staticConstructor = "of")
class MovementSelector implements Predicate<Creature> {
    private final Movement m;

    @Override
    public boolean test(Creature t) {
        return t.getMovement().equals(m);
    }
}

@Value(staticConstructor = "of")
class SizeSelector implements Predicate<Creature> {
    private final Size s;

    @Override
    public boolean test(Creature t) {
        return t.getSize().equals(s);
    }
}

原文地址:https://www.cnblogs.com/zhuxudong/p/10224746.html

时间: 2024-10-14 22:19:45

规范模式【其他模式】的相关文章

软件架构模式—分层模式

架构模式是什么 软件架构模式,诞生于软件开发的最大难题--需求变更.由于需求变更,导致了大量项目因为超出预算的人力.时间而归于失败.软件开发成本有限的,但需求变更似乎是无限的,这成为了一个非常难解决的问题. 软件需求变更的结果,基本上就是对于软件代码的修改.而软件代码的修改却是程序员们最头疼的事情.因为一些大型系统,其代码根本就无法完全看懂,即便能了解部分细节,在着手修改的时候,也会碰到"触一发而动全身"的问题:因为有些功能的修改,需要修改整个系统的很多部分,导致了无穷的BUG.另外一

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

专用服务器模式&amp;共享服务器模式

连接ORACLE服务器一般有两种方式:专用服务器连接(dedicated server)和共享服务器连接(shared server).那么两者有啥区别和不同呢?下面我们将对这两者的区别与不同一一剖析. 专用服务器模式(dedicated server)模式 在专用服务器模式中,用户进程运行在客户端的机器上,专用服务器进程运行在数据库服务器,用户进程和专用服务器进程是两种不同类型的进程. 对于专用服务器模式,在用户登录时,ORACLE总会创建一个新的服务进程,这通常称为专用服务器配置.这个服务器

Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runnable模式 我们先看一个并不是异步线程加载的例子,使用 Handler+Runnable模式. 这里为何不是新开线程的原因请参看这篇文章:Android Runnable 运行在那个线程 这里的代码其实是在UI 主线程中下载图片的,而不是新开线程. 我们运行下面代码时,会发现他其实是阻塞了整个界面

Java设计模式(五)外观模式 桥梁模式

(九)外观模式 外观模式为子系统提供一个接口,便于使用.解决了类与类之间关系的,外观模式将类之间的关系放在一个 Facade 类中,降低了类类之间的耦合度,该模式不涉及接口. class CPU { public void startup(){ System.out.println("cpu start"); } public void shutdown(){ System.out.println("cpu stop"); } } class Memory { pu

CentOS 7 单用户模式+救援模式

CentOS 7 单用户模式+救援模式.有时候大家可能会忘记自己的root密码,或者错误(命令输入错误,命令位置输入有误等)编辑了一个/etc目录下的核心文件导致系统不能正常启动了!怎么办?重新安装系统那是实在没有办法之举!那我们就进入如下两种方式把错误的配置文件改过来,重启系统不就好了吗!接下来咱们就学习一下两种模式恢复系统Lunix单用户模式+救援模式 单用户模式+救援模式类似windows的安全模式 使用虚拟机在系统里面输入指令重启系统是不能达到我们的要求的,也就是说IDC机房可不是想进就

设计模式-行为型模式-策略模式

策略模式 在实际工作中我用到了策略模式,但为什么要有环境角色呢? 这里我贴上英文对含义的介绍, The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 然后看看这种设计模式的组成, 一般的,策略模式

命令模式 &amp; 策略模式 &amp; 模板方法

一.策略模式 策略模式:封装易变化的算法,可互相替换. GoF<设计模式>中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换.该模式使得算法可独立于它们的客户变化. 比如:一个推送服务类,推送的方式,可以分为:QQ推送.邮箱推送.App推送.PC插件推送. 这里讲两个点: 1.推送方式可以互相替换: 2.这些推送方式只是单纯的属于推送服务这个类本身. 好好琢磨关键词:相互替换 二.命令模式 命令模式:解决“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题. GoF&l

delphi 11 编辑模式 浏览模式

编辑模式 浏览模式 设置焦点 //在使用前需要Webbrowser已经浏览过一个网页 否则错误 uses MSHTML; ///获取Webbrowser编辑模式里面的内容 procedure EditMode();begin  (Form1.WebBrowser1.Document as IHTMLDocument2).designMode := 'on';end;//----------------------------------------------------------------

管道和过滤器模式----POSA模式助记格式

名称:管道和过滤器(Pipes and Filters) 问题: 处理数据流 1.步骤可替换 2.步骤比组件更易于重用 3.不相连的步骤不共享信息 4.存在不同的输入数据源 5.可以以多种方式给出或存放输出结果 6.中间结果需要落地,以确保处理的正确性 7.暂不取消多重步骤(并发) 方案: 管道和过滤器模式----POSA模式助记格式,布布扣,bubuko.com