Specification

Specification 패턴은 도메인 객체에 대한 조건이나 규칙을 캡슐화하여 재사용 및 조합 가능한 형태로 표현하는 디자인 패턴입니다. 즉, 비즈니스 규칙이나 조건을 별도의 객체(스펙)로 분리하여, 여러 곳에서 재사용하거나 복합적인 조건을 구성할 수 있게 해줍니다.


How do Code❔

public interface Specification<T> {
    boolean isSatisfiedBy(T candidate);

    default Specification<T> and(Specification<T> other) {
        return candidate -> this.isSatisfiedBy(candidate) && other.isSatisfiedBy(candidate);
    }

    default Specification<T> or(Specification<T> other) {
        return candidate -> this.isSatisfiedBy(candidate) || other.isSatisfiedBy(candidate);
    }

    default Specification<T> not() {
        return candidate -> !this.isSatisfiedBy(candidate);
    }
}

public class Product {
    private String name;
    private double price;
    private boolean inStock;

    public Product(String name, double price, boolean inStock) {
        this.name = name;
        this.price = price;
        this.inStock = inStock;
    }

    // Getter 메서드들
    public String getName() { return name; }
    public double getPrice() { return price; }
    public boolean isInStock() { return inStock; }
}

public class PriceSpecification implements Specification<Product> {
    private double minPrice;
    private double maxPrice;

    public PriceSpecification(double minPrice, double maxPrice) {
        this.minPrice = minPrice;
        this.maxPrice = maxPrice;
    }

    @Override
    public boolean isSatisfiedBy(Product candidate) {
        return candidate.getPrice() >= minPrice && candidate.getPrice() <= maxPrice;
    }
}

Last updated