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

收银台处理许多种不同业务,这种情况下用什么设计模式比较合适?
举例:
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);
            }

        });
    }
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

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

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

或者事件 + 状态 更好些。

3年前 评论
lyxxxh (作者) 3年前
91it (楼主) 3年前
欧皇降临 3年前
lyxxxh (作者) 3年前
欧皇降临 3年前
91it (楼主) 3年前
讨论数量: 6

策略模式 怎么样? :see_no_evil:

3年前 评论
JeffreyBool

策略模式

3年前 评论
WytheHuang

策略模式

3年前 评论

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

3年前 评论

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

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

或者事件 + 状态 更好些。

3年前 评论
lyxxxh (作者) 3年前
91it (楼主) 3年前
欧皇降临 3年前
lyxxxh (作者) 3年前
欧皇降临 3年前
91it (楼主) 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);
         }

 });
3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!