收银台处理许多种不同业务这种适合用什么设计模式?

收银台处理许多种不同业务,这种情况下用什么设计模式比较合适?
举例:
1、零售业务
2、还款业务
3、充值业务

每一次收费之后,都需要处理将近10几个表。目前我都是在模型事件里面单独处理。

没有设计模式,代码很乱。

class Cashier extends BaseModel
{
    protected $table = 'cashier';
    protected $guarded = [];
    protected $primaryKey = 'id';
    protected $keyType = 'string';
    public $incrementing = false;

    protected $casts = [
        'arrearage' => 'float',
        'deposit'   => 'float',
        'income'    => 'float',
        'payable'   => 'float',
    ];

    public static function boot()
    {
        parent::boot();
        static::saved(function ($cashier) {

            // 顾问销售单
            if ($cashier->status == 2 && $cashier->cashierable_type == 'App\Models\Consultant') {
                self::handleConsultant($cashier);
            }

            // 医生门诊单收费
            if ($cashier->status == 2 && $cashier->cashierable_type == 'App\Models\Outpatient') {
                self::handleOutpatient($cashier);
            }

            // 充值
            if ($cashier->status == 2 && $cashier->cashierable_type == 'App\Models\Recharge') {
                self::handleCashierRecharge($cashier);
            }

            // 还款
            if ($cashier->status == 2 && $cashier->cashierable_type == 'App\Models\CashierArrearage') {
                self::handleRepayment($cashier);
            }

            // 退款
            if ($cashier->status == 2 && $cashier->cashierable_type == 'App\Models\CashierRefund') {
                self::handleCashierRefund($cashier);
            }

            // 零售收费
            if ($cashier->status == 2 && $cashier->cashierable_type == 'App\Models\CashierRetail') {
                self::handleCashierRetail($cashier);
            }

        });
    }
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
lyxxxh
最佳答案

状态 策略 或者不用都可以。

把每个业务都变成一个单独的类,这才是重点。

或者事件 + 状态 更好些。

1周前 评论
lyxxxh (作者) 1周前
xiaogui (楼主) 1周前
欧皇降临 4小时前
lyxxxh (作者) 3小时前
欧皇降临 3小时前
讨论数量: 6

策略模式啊,前提是客户端得知道所有策略

1周前 评论
lyxxxh

状态 策略 或者不用都可以。

把每个业务都变成一个单独的类,这才是重点。

或者事件 + 状态 更好些。

1周前 评论
lyxxxh (作者) 1周前
xiaogui (楼主) 1周前
欧皇降临 4小时前
lyxxxh (作者) 3小时前
欧皇降临 3小时前

数组大法好:


const HANDLE_FUNCTIONS = [
         'App\Models\Consultant' => 'handleConsultant',
         'App\Models\Recharge' => 'handleOutpatient'
          ...
];


static::saved(function ($cashier) {

         if($cashier->status === 2){
                if(!isset(static::HANDLE_FUNCTIONS[$cashier->cashierable_type])){
                            throw new \Exception('未定义相关操作方法');
               } 
               $function = static::HANDLE_FUNCTIONS[$cashier->cashierable_type];
               self::$function($cashier);
         }

 });
1周前 评论
JeffreyBool

策略模式

1周前 评论
WytheHuang

策略模式

1周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!