首页 > 其他分享 >laravel 策略模式、工厂模式使用案例

laravel 策略模式、工厂模式使用案例

时间:2024-09-10 17:24:34浏览次数:1  
标签:laravel function track App 模式 案例 Services 物流 trackingNumber

laravel 策略模式、工厂模式使用案例

在 Laravel 中使用设计模式来对接多个物流服务商(如菜鸟、顺丰、极兔),可以使用 策略模式工厂模式 来实现动态调用不同物流接口的功能。下面的示例展示了如何使用策略模式来实现这个需求,通过一个父类,多个子类来处理不同的物流服务商,并根据单号选择对应的物流服务商。

步骤

  1. 定义物流接口(父类):定义物流接口,所有物流服务商都必须实现该接口。
  2. 定义各个物流服务商的子类:每个物流服务商继承父类并实现特定的物流接口逻辑。
  3. 编写服务工厂类:根据传入的物流单号选择合适的物流服务商类。
  4. 使用依赖注入调用相应物流服务商

1. 定义物流接口

app/Services/Shipping/ShippingServiceInterface.php 中定义接口。


namespace App\Services\Shipping;

interface ShippingServiceInterface
{
    public function track($trackingNumber);
}

2. 实现各个物流服务商(子类)

app/Services/Shipping/ 目录下,为每个物流公司创建一个类。

菜鸟物流类


namespace App\Services\Shipping;

class CainiaoShippingService implements ShippingServiceInterface
{
    public function track($trackingNumber)
    {
        // 菜鸟物流的具体查询逻辑
        return "Tracking Cainiao package: " . $trackingNumber;
    }
}

顺丰物流类


namespace App\Services\Shipping;

class SFShippingService implements ShippingServiceInterface
{
    public function track($trackingNumber)
    {
        // 顺丰物流的具体查询逻辑
        return "Tracking SF package: " . $trackingNumber;
    }
}

极兔物流类


namespace App\Services\Shipping;

class JituShippingService implements ShippingServiceInterface
{
    public function track($trackingNumber)
    {
        // 极兔物流的具体查询逻辑
        return "Tracking Jitu package: " . $trackingNumber;
    }
}

3. 创建物流服务工厂类

app/Services/Shipping/ShippingServiceFactory.php 中创建一个工厂类,负责根据单号选择对应的物流服务商。


namespace App\Services\Shipping;

class ShippingServiceFactory
{
    public function getShippingService($trackingNumber)
    {
        // 根据 trackingNumber 判断使用哪个物流服务商
        if (strpos($trackingNumber, 'CN') === 0) {
            return new CainiaoShippingService();
        } elseif (strpos($trackingNumber, 'SF') === 0) {
            return new SFShippingService();
        } elseif (strpos($trackingNumber, 'JT') === 0) {
            return new JituShippingService();
        } else {
            throw new \Exception('No matching shipping service found.');
        }
    }
}

4. 在控制器中调用

app/Http/Controllers/ShippingController.php 中编写控制器,调用物流服务。


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\Shipping\ShippingServiceFactory;

class ShippingController extends Controller
{
    protected $shippingFactory;

    public function __construct(ShippingServiceFactory $shippingFactory)
    {
        $this->shippingFactory = $shippingFactory;
    }

    public function trackPackage($trackingNumber)
    {
        try {
            // 根据单号选择对应的物流服务
            $shippingService = $this->shippingFactory->getShippingService($trackingNumber);
            $trackingInfo = $shippingService->track($trackingNumber);

            return response()->json([
                'status' => 'success',
                'data' => $trackingInfo
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'status' => 'error',
                'message' => $e->getMessage()
            ], 400);
        }
    }
}

5. 路由

routes/web.php 中添加路由:


use App\Http\Controllers\ShippingController;

Route::get('/track/{trackingNumber}', [ShippingController::class, 'trackPackage']);

6. 依赖注入配置(可选)

为了更方便使用 Laravel 的依赖注入机制,你可以在 AppServiceProvider 中将服务工厂类注册为单例。


namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\Shipping\ShippingServiceFactory;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(ShippingServiceFactory::class, function ($app) {
            return new ShippingServiceFactory();
        });
    }

    public function boot()
    {
        //
    }
}

使用

你可以通过访问 /track/{trackingNumber} 来测试。例如:

  • /track/CN123456 使用菜鸟物流
  • /track/SF123456 使用顺丰物流
  • /track/JT123456 使用极兔物流

总结

通过使用策略模式(结合工厂模式),你可以轻松对接多个物流服务商,并根据物流单号选择合适的服务。

标签:laravel,function,track,App,模式,案例,Services,物流,trackingNumber
From: https://www.cnblogs.com/pine007/p/18406815

相关文章

  • 广州浮点UGNX软件许可优化实施成功案例
    UGNX许可证优化提升团队效率与节省成本实施行业:航空航天与高端制造实施软件:UGNX软件一、背景概述1.项目背景UGNX是一款领先的计算机辅助设计(CAD)、计算机辅助制造(CAM)和计算机辅助工程(CAE)软件,广泛应用于航空航天、高端制造等行业。然而,某航空航天公司在处理设计高峰期时,遇到了许......
  • 单例模式解析
    1.什么是单例模式一种常用的软件设计模式,它确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。2.单例模式存在原因(1)确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。(2)用于控制资源访问、管理共享资源(如配置文件、数据库连接等)或实现一个全局服务......
  • python装饰器模式实现切面功能
    引言在软件开发中,我们经常会遇到一些横切关注点(cross-cuttingconcerns),如日志记录、事务管理、安全性检查等,这些关注点通常会跨越多个模块。传统的编程方式会导致代码的重复和分散,难以维护。面向切面编程(AOP)是一种编程范式,它通过提供一种新的方式来模块化横切关注点,从而提高代码......
  • IEC103设备数据 转 IEC61850项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 24 配置VFBOX网关采集103设备数是 25 用IEC61850协议转发数据 46 网关使用多个逻辑设备和逻辑节点的方法 67 IEC103协议说明 88 案例总结 91 案例说明设置网关采集IEC103设备数据把采集的数据转成IEC61850协议转发给......
  • Axure科技感设计案例教程:从按钮到大屏的全面探索
    AxureRP,作为一款强大的原型设计工具,不仅能够帮助设计师快速构建产品界面,还能通过其丰富的交互功能实现高度逼真的科技感效果。以下是一个简要的教程,介绍如何使用AxureRP设计科技感按钮、图标、统计、图表以及大屏界面。1.科技感按钮设计设计思路:科技感按钮往往强调简洁、......
  • JavaScript之模块模式
    一模块模式JavaScript模块模式有传统的立即调用函数表达式(IIFE)、CommonJS、AMD、ES6模块立即调用函数表达式(IIFE)立即调用函数表达式(IIFE)是一种设计模式,通过创建一个立即执行的函数来封装代码,避免全局命名空间污染。IIFE结构如下:(function(){//你的代码})(......
  • Docker Compose 案例
    version:'3.8'x-app:&appbuild:dockerfile:./Dockerfilerestart:unless-stoppedworking_dir:/appvolumes:-.:/app/oms-odoo#将本地的app目录挂载到容器的/app目录-./log:/var/log#environment:#-REDIS_URL=redis://host.......
  • java常见的设计模式
    java常见的设计模式1.什么是设计模式?设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码......
  • GB28181规范中broadcast和talk模式实际场景时间差别在哪里?
    好多开发者对GB28181规范里面,broadcast和talk模式区分不清,今天借此机会,针对GB28181标准中的Broadcast(广播)和Talk(对讲)是两种不同的通信模式,它们在视频监控系统中扮演着不同的角色,做个基础的扫盲,二者具有以下区别:1.功能和用途Broadcast(广播): 功能:主要用于平台侧向设备侧发送单向的通......
  • 几种并发模式的实现
    常见的几个需要并发的场景,具体的实现方式asyncio异步并发importasyncioasyncdeftask(id,delay):awaitasyncio.sleep(delay)returnf"Task{id}completed"asyncdefmain():tasks=[task(1,2),task(2,1),task(3,3)]done,pending=await......