如何解决这个问题(设计模式)

罗汉·塞西(Rohan Sethi)

我有一个计费系统,其中不同类型的客户具有不同类型的折扣方案。对于给定的帐单,应根据客户和产品的类型生成应付帐款净额。

而且也没有什么规则。喜欢 :

•如果用户是商店的员工,则可获得30%的折扣

•如果用户是商店的会员,则可获得10%的折扣

•如果用户已成为客户2年以上,则可享受5%的折扣。

•账单上的每100美元,将有5美元的折扣(例如,对于990美元,您将获得45美元的折扣)。

•基于百分比的折扣不适用于杂货...

我脑子里没什么主意。第一个选择是考虑一个装饰器模式:

Customer <<Interface>>     

|                       
CustomerImpl  



DiscountDecorator <<AbstractClass>> imp Customer

 |             |            |           |
AffiDiscount   StoreEmp   OverTwoYears   AnyOtherDisc
               Discount     Discount       Discount
Items  { 
//? ? :/
}

但是,那Discounts也要依赖于Items

我有什么选择?

  • CustomerItem接口扩展接口以跟踪项目类型?
  • 通过ListItems对折类。...如何与CustomerItem正确关联,以便可以将它们一起装饰?
雷·塔耶克(Ray Tayek)

我还看不到需要某种模式,也许只是做这样的事情:

import java.util.EnumSet;
public class So35680415 {
    enum Discount {
        employee {
            @Override double discount(double amount) {
                return amount*.30;
            };
        },
        affiliate {
            @Override double discount(double amount) {
                // TODO Auto-generated method stub
                return amount*.10;
            };
        },
        customerForTwoYears {
            @Override double discount(double amount) {
                return Math.floor(amount/100)*100*.05;
            };
        };
        abstract double discount(double amount);
    }
    static class User {
        void discounts(double amount) {
            for(Discount discount:discounts)
                System.out.println("discount for: "+discount+" on: $"+amount+" is: $"+discount.discount(amount));
        }
        EnumSet<Discount> discounts=EnumSet.noneOf(Discount.class);
    }
    public static void main(String[] args) {
        User user=new User();
        user.discounts.add(Discount.employee);
        user.discounts(100);
        System.out.println("---");
        user.discounts.add(Discount.affiliate);
        user.discounts(100);
        System.out.println("---");
        user.discounts.add(Discount.customerForTwoYears);
        user.discounts(100);
        System.out.println("---");
    }
}

编辑回答问题:它似乎没有违反srp,因为它做一件事即计算折扣。枚举似乎是完成任务的理想选择。枚举的类型子类。添加另一个枚举很容易。它确实看起来像策略模式

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章