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