下面是一个基本的Java代码示例,可以通过多家供应商发送短信:
普通版
import java.io.*;
import java.net.*;
import java.util.*;
public class SmsSender {
private static final String VENDOR_1_API_URL = "https://vendor1api.com/sendSMS";
private static final String VENDOR_2_API_URL = "https://vendor2api.com/sendSMS";
private static final String VENDOR_1_API_KEY = "vendor1apikey";
private static final String VENDOR_2_API_KEY = "vendor2apikey";
public static void sendSms(String vendor, String recipient, String message) throws Exception {
String apiUrl = null;
String apiKey = null;
if (vendor.equals("vendor1")) {
apiUrl = VENDOR_1_API_URL;
apiKey = VENDOR_1_API_KEY;
} else if (vendor.equals("vendor2")) {
apiUrl = VENDOR_2_API_URL;
apiKey = VENDOR_2_API_KEY;
} else {
throw new IllegalArgumentException("Invalid vendor: " + vendor);
}
URL url = new URL(apiUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", apiKey);
conn.setDoOutput(true);
String jsonPayload = "{\"recipient\":\"" + recipient + "\",\"message\":\"" + message + "\"}";
OutputStream os = conn.getOutputStream();
os.write(jsonPayload.getBytes());
os.flush();
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
String output;
System.out.println("Output from " + vendor + " API:");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
}
public static void main(String[] args) {
try {
sendSms("vendor1", "1234567890", "Hello from Vendor 1");
sendSms("vendor2", "0987654321", "Hello from Vendor 2");
} catch (Exception e) {
e.printStackTrace();
}
}
}
这个代码示例定义了两个供应商的API URL和API密钥,分别是VENDOR_1_API_URL
、VENDOR_2_API_URL
和VENDOR_1_API_KEY
、VENDOR_2_API_KEY
。在sendSms
方法中,根据供应商参数选择API URL和API密钥,构造JSON负载,并将其作为POST请求发送到API。然后,读取API的响应并输出到控制台。
在main
方法中,使用sendSms
方法发送两条短信,分别使用vendor1
和vendor2
作为供应商参数。
请注意,这只是一个基本的示例,您需要根据您所使用的供应商的具体API进行修改。
进阶-设计模式版
为了通过多家供应商发送短信,可以使用工厂模式和策略模式的组合来实现。
首先,使用工厂模式创建一个名为 SMSProviderFactory
的工厂类。该工厂类的作用是根据供应商名称创建相应的 SMSProvider
对象。SMSProvider
是一个抽象类,其中包含发送短信的方法 sendSMS
。
接下来,创建具体的供应商类 SupplierAProvider
和 SupplierBProvider
,这些类继承 SMSProvider
并实现 sendSMS
方法。每个具体供应商类都实现了它自己的发送短信逻辑。
然后,创建一个名为 SMSManager
的类,它使用策略模式来决定使用哪个供应商发送短信。该类包含一个 SMSProvider
类型的成员变量,并在构造函数中初始化该变量为默认的供应商。类还包含一个名为 setProvider
的方法,该方法允许客户端设置使用的供应商。
最后,在客户端代码中使用 SMSManager
对象来发送短信。可以使用 setProvider
方法来更改使用的供应商。
// 抽象供应商类
public abstract class SMSProvider {
public abstract void sendSMS(String phoneNumber, String message);
}
// 具体供应商类 A
public class SupplierAProvider extends SMSProvider {
public void sendSMS(String phoneNumber, String message) {
// 发送短信逻辑
}
}
// 具体供应商类 B
public class SupplierBProvider extends SMSProvider {
public void sendSMS(String phoneNumber, String message) {
// 发送短信逻辑
}
}
// 工厂类
public class SMSProviderFactory {
public static SMSProvider createProvider(String providerName) {
if (providerName.equals("SupplierA")) {
return new SupplierAProvider();
} else if (providerName.equals("SupplierB")) {
return new SupplierBProvider();
} else {
throw new IllegalArgumentException("Invalid provider name");
}
}
}
// 管理器类
public class SMSManager {
private SMSProvider provider;
public SMSManager() {
provider = SMSProviderFactory.createProvider("SupplierA");
}
public void setProvider(String providerName) {
provider = SMSProviderFactory.createProvider(providerName);
}
public void sendSMS(String phoneNumber, String message) {
provider.sendSMS(phoneNumber, message);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
SMSManager smsManager = new SMSManager();
smsManager.sendSMS("1234567890", "Hello, world!");
smsManager.setProvider("SupplierB");
smsManager.sendSMS("0987654321", "Goodbye, world!");
}
}
在上述示例中,SMSProviderFactory
工厂类根据供应商名称创建相应的 SMSProvider
对象。SMSManager
类使用策略模式来决定使用哪个供应商发送短信。客户端代码