• javascript 写策略模式,商场收银打折优惠策略


    [Decode error - output not utf-8]
    -----------------------------
      购物清单  
    
      方便面 : 100 x 50 = 5000 |  4000
      菊花茶 : 10 x 50 = 500 |  500
    -----------------------------
      优惠使用 : 国庆1折优惠
      购物合计  4500 -> 450
    
    [Finished in 0.6s]

    首先封装收银机类,怎么把商品设进,怎么把收银金额输出。

    然后封装商品,和金额独立

    然后进行收银策略编写。打折,满返针对的是最后的结果。

    收银机添加设置策略接口,调用原生金额接口,调用策略接口,获得策略后金额接口

    下个需求到商品的具体折扣,譬如买几送几

    封装策略到商品处,商品创建的时候根据自己的名字到工厂去领取自己的“福利”

    后续还想实施,组合折扣,譬如买牙膏同时买牙刷,减5块钱

    架构要大改了(・-・*) ,暂时搁置 

    /**
     * by JackChen 2016-3-15 19.20.01
     * 看完马士兵老师策略模式后作业
     *
     * 原文是讲解comparable接口 和 compareTo
     * 
     * 所有实现了comparable接口的类都可以用于比较。
     * 
     * 而更高级的是,我不同场景需要不同的比较时,通过定制本类的比较器,
     * 借用比较器的compareTo,得到不同的比较结果
     *
     * 已实现
     * 1. 单个物品多个数量
     * 2. 多个物品多个数量
     * 3. 多个物品结算打印
     * 4. 多个物品总金额折扣策略(几折、满返)
     * 5. 单个物品优惠策略(多少个送多少个)
     *
     * 待实现
     * 6. 单个物品 买多个送多个 跟购物物品无关
     * 7. 组合购买
     */
    
    
    
    
    ////////////////////////////////////////////////////////////////////////
    ///  收银策略类
    
    //普通收钱
    var NormalStrategy = function() {
        var self = this;
        self.type = "total";
        self.description = "没有使用优惠";
    };
    NormalStrategy.prototype = {};
    NormalStrategy.prototype.constructor = NormalStrategy;
    NormalStrategy.prototype.desc = function() {
        return this.description;
    };
    NormalStrategy.prototype.discount = function(money) {
        return money;
    };
    
    //折扣策略
    var PrecentOffStrategy = function(description, precent) {
        var self = this;
        self.type = "total";
        self.precent = precent;
        self.description = description + (precent*10) + "折优惠";
    };
    PrecentOffStrategy.prototype = new NormalStrategy();
    PrecentOffStrategy.prototype.constructor = PrecentOffStrategy;
    PrecentOffStrategy.prototype.desc = function() {
        return this.description;
    };
    PrecentOffStrategy.prototype.discount = function(money) {
        return money * this.precent;
    };
    
    //满返策略
    var GivebackStrategy = function(description, enough, giveback) {
        var self = this;
        self.type = "total";
        self.enough = enough;
        self.giveback = giveback;
        self.description = description + "满"+ enough + "返" + giveback + "优惠";
    };
    GivebackStrategy.prototype = new NormalStrategy();
    GivebackStrategy.prototype.constructor = GivebackStrategy;
    GivebackStrategy.prototype.desc = function() {
        return this.description;
    };
    GivebackStrategy.prototype.discount = function(money) {
        if (money >= this.enough) {
            money -= this.giveback;
        };
        return money;
    };
    
    
    
    
    
    
    
    
    
    
    
    ////////////////////////////////////////////////////////////////////////
    ///  销售品种折扣工厂
    
    var SaleItemStrategyFactory = function() {
    };
    SaleItemStrategyFactory.prototype = {};
    SaleItemStrategyFactory.prototype.constructor = SaleItemStrategyFactory;
    SaleItemStrategyFactory.prototype.getInstance = function(name) {
        var self = this;
        var strategy = null;
    
        switch (name) {
            case "方便面":
                strategy = new BuyMoreStrategy("特惠",4,1);
                break;
            default:
                // statements_def
                break;
        }
    
    
        return strategy;
    };
    
    //普通
    var ItemNormalStrategy = function() {
        var self = this;
        self.type = "total";
        self.description = "没有优惠";
    };
    ItemNormalStrategy.prototype = {};
    ItemNormalStrategy.prototype.constructor = ItemNormalStrategy;
    ItemNormalStrategy.prototype.desc = function() {
        return this.description;
    };
    ItemNormalStrategy.prototype.discount = function(money) {
        return money;
    };
    
    //买几送几
    var BuyMoreStrategy = function(description, buy, free) {
        var self = this;
        self.type = "total";
        self.buy = buy;
        self.free = free;
        self.description = description + "买"+ buy + "送" + free;
    };
    BuyMoreStrategy.prototype = new ItemNormalStrategy();
    BuyMoreStrategy.prototype.constructor = BuyMoreStrategy;
    BuyMoreStrategy.prototype.desc = function() {
        return this.description;
    };
    BuyMoreStrategy.prototype.discount = function(item) {
        var give = item.num / (this.buy + this.free);
        var left = item.num % (this.buy + this.free);
        money = (give* this.buy + left)*item.price;
        return money;
    };
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ////////////////////////////////////////////////////////////////////////
    ///  销售品种
    
    var SaleItem = function(name , price) {
        var self = this;
        self.name = name;
        self.price = price;
        self.num = 1;
        self.strategy = factory.getInstance(self.name);
    };
    SaleItem.prototype = {};
    SaleItem.prototype.constructor = SaleItem;
    SaleItem.prototype.clone = function() {
        var self = this;
        var cloneItem = new SaleItem();
        cloneItem.name = self.name;
        cloneItem.price = self.price;
        cloneItem.num = self.num;
        cloneItem.strategy = self.strategy;
        return cloneItem;
    };
    SaleItem.prototype.count = function() {
        return this.price * this.num;
    };
    SaleItem.prototype.discountProcess = function(money) {
        if (this.strategy) {
            money = this.strategy.discount(this);
        };
        return money;
    };
    SaleItem.prototype.discount = function() {
        return this.discountProcess(this.count());
    };
    
    
    
    
    
    
    
    
    ////////////////////////////////////////////////////////////////////////
    ///  收银策略类
    
    var CashRegister = function() {
        var self = this;
        self.totalDiscountStrategy = new NormalStrategy();
        self.arr = [];
    };
    CashRegister.prototype = {};
    CashRegister.prototype.constructor = CashRegister;
    
    //添加商品
    CashRegister.prototype.add = function(item, num) {
        var self = this;
        if (num) {
            item.num = num;
        };
        
        self.arr.push(item);
    };
    //添加折扣策略
    CashRegister.prototype.setTotalDiscountStrategy = function(strategy) {
        this.totalDiscountStrategy = strategy;
    };
    
    //总计金额
    CashRegister.prototype.count = function() {
        var self = this;
        var totalMoney = 0;
        self.arr.forEach( function(item, index) {
            totalMoney += item.discount();
        });
        return totalMoney;
    };
    //折扣加入
    CashRegister.prototype.discountProcess = function(money) {
        var self = this;
        if (self.totalDiscountStrategy) {
            money = self.totalDiscountStrategy.discount(money);
        };
        return money;
    };
    //折后金额
    CashRegister.prototype.discount = function() {
        var self = this;
        var totalMoney = self.count();
        return self.discountProcess( totalMoney );
    };
    
    //结算清单
    CashRegister.prototype.print = function() {
        var self = this;
        console.log('-----------------------------');
        console.log('  购物清单  ');
        console.log('');
    
        var totalMoney = 0;
        self.arr.forEach(function(item, index) {
            console.log("  %s : %s x %s = %s | ",item.name, item.price, item.num, item.count(),item.discount());
        });
    
        console.log('-----------------------------');
        console.log('  优惠使用 : ' + self.totalDiscountStrategy.desc())
        console.log('  购物合计  ' + self.count() +" -> "+ self.discount() );
        console.log('');
    };
    
    
    
    
    
    
    
    
    
    
    
    
    
    ////////////////////////////////////////////////////////////////////////
    ///  测试类
    
    var factory = new SaleItemStrategyFactory();
    
    var cashRegister = new CashRegister();
    cashRegister.setTotalDiscountStrategy(new PrecentOffStrategy("国庆",0.1));
    // cashRegister.setTotalDiscountStrategy(new GivebackStrategy("劳动节",500,300));
    // cashRegister.setTotalDiscountStrategy(new GivebackStrategy("劳动节",1000,500));
    
    
    cashRegister.add(new SaleItem("方便面",100),50);
    cashRegister.add(new SaleItem("菊花茶",10),50);
    
    
    
    
    cashRegister.print();
    View Code
  • 相关阅读:
    Android开发 GradientDrawable详解
    Android开发 ShapeDrawable详解
    Android开发 ViewPager删除Item后,不会更新数据和View
    Android开发 输入法调用学习
    Android开发 EditText的开发记录
    Android开发 TextView的开发记录
    Android开发 获取View的尺寸的2个方法
    Android开发 获取视频中的信息(例如预览图或视频时长) MediaMetadataRetriever媒体元数据检索器
    Android开发 Tablayout的学习
    Python 模块-zipfile
  • 原文地址:https://www.cnblogs.com/Again/p/5284850.html
Copyright © 2020-2023  润新知