我有3个不同的Web服务器来处理用户数据(username / passwd / email / etc.)。我分别有3个不同的Web服务调用,因此我创建了3个不同的类,这些类需要相同的信息(getUsername
,setUsername
,getEmail
,setEmail
等。 )。从主类我实例化每个webservice-call对象,当我有一个新用户名的请求时,我调用每个类的createUsername()
方法(配置数据)。
您对如何应用此问题的设计模式有任何建议吗?我想创建一个具有方法createUsername() {}
的类,在此我将调用每个webservice类并将每个结果存储在预定义的数组中。有没有人有任何建议或更好的做法?
目前我有:
class webservice1calls {
function createUser($username, $password) {}
function deleteUser($username, $password) {}
function createGroup($groupname) {}
function deleteGroup($groupname) {}
}
class webService2calls {
function createUser($username, $password) {} //different implementation
function deleteUser($username, $password) {} //different implementation
function createGroup($groupname) {} //different implementation
function deleteGroup($groupname) {} //different implementation
}
class webService3calls {
function createUser($username, $password) {} //different implementation
function deleteUser($username, $password) {} //different implementation
function createGroup($groupname) {} //different implementation
function deleteGroup($groupname) {} //different implementation
}
//My "like a proxy" class:
class webServiceCalls {
function createUser($username, $password) {
$ws1 = new webService1calls();
$ws2 = new webService2calls();
$ws3 = new webService3calls();
$res1 = $ws1->createUser($username, $password);
$res2 = $ws2->createUser($username, $password);
$res3 = $ws3->createUser($username, $password);
// return result depending $res1,$res2 and $res3 values
}
//and the call is done from another class somewhat like this:
class doThings {
function run() {
$ws = new webServiceCalls();
$ws_res = $ws->createUser();
}
}
我认为上面的表示可以帮助你理解当前的情况
设计(也许更好地理解问题。
谢谢!
答案 0 :(得分:1)
EEP!首先,由于它们非常相似,它们应该共享一个公共基类或使用接口:
interface WebService {
function createUser($username, $password);
function deleteUser($username, $password);
function createGroup($groupname);
function deleteGroup($groupname);
}
class MyService implements WebService {
function createUser($username, $password) {}
function deleteUser($username, $password) {}
function createGroup($groupname) {}
function deleteGroup($groupname) {}
}
其次,我希望您的服务实际上不被称为1,2,3。如果它们是,那对我来说可能是你应该使用某种形式的阵列。
我不喜欢你对“代理”课程的看法。您是否总是使用所有3种服务,或者这是某种类型的库,您只需要包含所需的服务?您没有提供有关您实际想要完成的内容的足够信息。
答案 1 :(得分:0)
您如何看待Model - ModelMapper拱? Zend Framework使用这种方法。您可能有以下类:(愚蠢的命名约定以便更好地理解)
Model_User
Mapper_User_Email
Mapper_User_Name
Mapper_User_Password
各个映射器读取所需数据,第三方类只调用Model_User-> getName()
修改强> 用法示例:
//simple code:
$user = new Model_User();
echo "Your name is: " . $user->getName();
//Model_User:
public function getName() {
if($this->_name = null) {
$this->getNameMapper()->getName($this);
//getNameMapper() returns a Mapper_User_Name object
}
return $this->getName();
}
//Mapper_User_Name:
public function getName($user) {
$name = "john"; /*magic here, the class communicate with the service that holds names*/
$user->setName($name);
}
仅限示例,吸气剂和制定者可能更具防御性。
答案 2 :(得分:0)
我喜欢将每个服务器的实现保存在一个单独的类中的想法,我也喜欢Mark的利用接口的想法。我也喜欢你对代理类的想法,但不是你提出的形式。我会创建一个充当各种各样的类的类。像这样:
class WebServicePool implements WebService {
private $webServices = array();
public function registerWebService($service) {
if($service instanceof WebService)
$this->webServices[] = $service;
}
function createUser($username, $password) {
foreach($this->webServices as $service)
$service->createUser($username, $password);
}
// ...
}
您还可以使用魔术方法来代理此功能:
class WebServicePool {
private $webServices = array();
public function registerWebService($service) {
if($service instanceof WebService)
$this->webServices[] = $service;
}
function __call($name, $arguments) {
foreach($this->webServices as $service)
call_user_func_array(array($service, $name), $arguments);
}
}
这样,如果向界面添加更多功能,则无需更新池类。希望这有帮助!
答案 3 :(得分:-1)
我会采取完全不同的方法。 REST interface对于您正在尝试做的事情来说是完美的,这是标准的CRUD命令。