【问题标题】:Using Interfaces to design an application [closed]使用接口设计应用程序 [关闭]
【发布时间】:2014-09-27 15:01:10
【问题描述】:

我正在尝试实现Short Message Service 或您将其称为手机短信服务到我的 PHP 应用程序中,该应用程序将使用各种 SMS 提供商向我的客户发送短信(实际情况不同,但在这里我正在尽我所能解释我的问题,所以请只忍受这个 SMS 示例)。

现在,我被告知要遵循设计模式(不确定是哪一种,因为我不熟悉模式)来集成它。

我的短信类应该有以下方法

<?php
class Verizon
{
        public function __construct($apiKey){
                // class constructor code...
        }

        public function AddNumber(array $numbers)
        {
                // ...
        }

        public function Send()
        {
                // ...
        }
}

现在,就像 verizon 一样,我将来会拥有不同的提供商,例如 AT&T、Cellcom、T-Mobile US 等...

以下是问题:

第一季度。为不同的提供者设置不同的课程真的是个好主意吗?意味着如果我需要实现一个新的提供者,我必须编写一个新类?如果没有,那是什么?

第二季度。在这种情况下如何使用接口? (我被告知使用接口)

第三季度。如果您可以为我草拟一个实现接口的最佳方式的结构框架,我将不胜感激。

提前多谢

【问题讨论】:

    标签: php oop interface abstract-class


    【解决方案1】:

    第一季度。为不同的提供者设置不同的课程真的是个好主意吗?意味着如果我需要实现一个新的提供者,我必须编写一个新类?如果没有,那是什么?

    是的,这是解决问题的好方法。所有提供者都应该支持相同的基本操作集,因此接口可以帮助您从应用程序的其余部分中抽象出提供者特定的细节。

    第二季度。在这种情况下如何使用接口? (我被告知使用接口)

    对于简单的短信,这样简单的事情可能就可以了:

    interface ISMSProvider
    {
        public function sendSMS($number, $message);
    }
    

    我会考虑编写实现,以便$number 可以是单个数字或数字数组。那么您的提供者对象是无状态的(您不需要AddNumber() 等;所有信息都在参数中传递)。

    第三季度。如果您可以为我草拟一个实现接口的最佳方式的结构框架,我将不胜感激。

    给定上面的接口,你会写一个类似这样的实现:

    class VerizonSMSProvider implements ISMSProvider
    {
        // Add a constructor if you need to provide variable details such as API
        // endpoint or API key.
    
        public function sendSMS($number, $message)
        {
            // Actual implementation here.
        }
    }
    

    【讨论】:

    • sms 是“全球性的”,那么为什么每个提供者都有一个类?全球有数千个?
    • @Dagon 因为那样你就可以换出实现了;代码不必绑定到特定的提供程序。例如,您可能有一个函数,给定一个电话号码,返回提供者以用于该电话号码。然后调用代码不必关心它是什么提供者,只要它可以发送SMS消息即可。 (你甚至可以有一个元提供者,它会迭代号码列表并委托给每个特定的提供者。)
    • @Dagon(即使您在全球只有一个提供商,如果您切换提供商,这也可以让您轻松更换实现。)
    • @cdhowie 感谢您的回复。我还有另一种情况。假设要使用所有这些不同的提供者,我必须使用他们的 API 库,我必须在某处包含/自动加载,实例化他们的类,并且根据它是什么 sms 提供者,我将使用该提供者的 api 库。我在哪里添加这些库以及在哪里执行 IF ELSE 条件以加载第三方 api 库?
    猜你喜欢
    • 1970-01-01
    • 2017-07-29
    • 2011-07-03
    • 1970-01-01
    • 2011-09-30
    • 2014-11-27
    • 2017-08-11
    • 2010-09-07
    • 2011-03-13
    相关资源
    最近更新 更多