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