image.png

肖哥弹架构 跟大家“弹弹” 业务中设计模式的使用,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

在电商平台中,用户经常需要根据各种条件筛选商品,例如价格范围、品牌、评价等级等。规格模式提供了一种灵活的方式来构建复杂的筛选逻辑。

2. 为什么要使用规格设计模式

规格模式允许将复杂的筛选逻辑分解为一个个简单的筛选规格(Specification),并可以灵活地组合这些规格。

3. 标准规格设计模式图

image.png

4. 业务规格设计模式图

image.png

5. 业务代码参考
    // 商品类
    class Product {
        private double price;
        private String brand;
        private double rating;

        public Product(double price, String brand, double rating) {
            this.price = price;
            this.brand = brand;
            this.rating = rating;
        }

        public double getPrice() {
            return price;
        }

        public String getBrand() {
            return brand;
        }

        public double getRating() {
            return rating;
        }
    }

    // 规格接口
    interface Specification {
        boolean isSatisfiedBy(Product product);
    }

    // 价格规格
    class PriceSpecification implements Specification {
        private double minPrice;
        private double maxPrice;

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

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

    // 品牌规格
    class BrandSpecification implements Specification {
        private String brand;

        public BrandSpecification(String brand) {
            this.brand = brand;
        }

        @Override
        public boolean isSatisfiedBy(Product product) {
            return product.getBrand().equalsIgnoreCase(brand);
        }
    }

    // 评价规格
    class RatingSpecification implements Specification {
        private double rating;

        public RatingSpecification(double rating) {
            this.rating = rating;
        }

        @Override
        public boolean isSatisfiedBy(Product product) {
            return product.getRating() >= rating;
        }
    }

    // 组合规格
    class AndSpecification implements Specification {
        private List<Specification> specifications = new ArrayList<>();

        public void add(Specification specification) {
            specifications.add(specification);
        }

        @Override
        public boolean isSatisfiedBy(Product product) {
            for (Specification specification : specifications) {
                if (!specification.isSatisfiedBy(product)) {
                    return false;
                }
            }
            return true;
        }
    }

    // 客户端使用
    class ECommerceProductFilter {
        public static void main(String[] args) {
            List<Product> products = new ArrayList<>();
            // 添加多个商品实例

            Specification priceSpec = new PriceSpecification(1000, 3000);
            Specification brandSpec = new BrandSpecification("Apple");
            Specification ratingSpec = new RatingSpecification(4.0);

            Specification combinedSpec = new AndSpecification();
            combinedSpec.add(priceSpec);
            combinedSpec.add(brandSpec);
            combinedSpec.add(ratingSpec);

            for (Product product : products) {
                if (combinedSpec.isSatisfiedBy(product)) {
                    System.out.println("产品 " + product.getBrand() + " 符合筛选条件。");
                }
            }
        }
    }
6. 使用规格设计模式的好处
  • 筛选逻辑的灵活性:可以灵活地组合不同的筛选规格,满足复杂的筛选需求。
  • 易于扩展:新增筛选规格时,只需实现Specification接口。
7. 其他使用规格设计模式场景参考
  • 搜索引擎的高级查询:构建复杂的查询条件组合。
  • 数据报表的动态筛选:根据不同的业务规则筛选数据。
8. 可参考开源框架
  • Apache Commons Collections:提供了PredicateTransformer等类似规格模式的功能。

总结

规格模式提供了一种灵活的方式来构建和组合复杂的筛选逻辑,使得代码更加清晰和易于维护。

历史热点文章