【发布时间】:2013-07-29 13:08:33
【问题描述】:
我似乎没有掌握接口如何实现松散耦合的概念?您可能会发现这个问题与其他一些问题重复,但我已经阅读了许多与该主题相关的答案,但我还没有找到令人满意的解释。
以下是有多少开发人员实施松散耦合的示例。
interface shape {
public function sayName();
}
class Circle implements shape {
public function sayName(){
echo 'Hello my name is circle';
}
}
class Square implements shape {
public function sayName(){
echo 'Hello my name is square';
}
}
class Creator {
public $shape = null;
public function __construct(Shape $shape){
$this->shape = $shape;
}
}
$circle = new Creator(new Circle());
$circle->sayName();
$square = new Creator(new Square());
$square->sayName();
在上面的例子中,我们使用了接口的多态性来实现松耦合。但我没有看到这段代码是松散耦合的。在上面的示例中,调用代码(客户端)使用“new”运算符直接引用“Circle”和“Square”类,因此创建了紧密耦合。
为了解决这个问题,我们可以这样做。
界面形状{ 公共函数sayName(); }
class Circle implements shape {
public function sayName(){
echo 'Hello my name is circle';
}
}
class Square implements shape {
public function sayName(){
echo 'Hello my name is square';
}
}
class Creator {
public $shape = null;
public function __construct($type){
if(strtolower($type) == 'circle'){
$this->shape = new Circle();
} else if(strtolower($type) == 'square'){
$this->shape = new Square();
} else {
throw new Exception('Sorry we don\'t have '.$type.' shape');
}
}
}
$circle = new Creator('Circle');
$circle->sayName();
$square = new Creator('Square');
$square->sayName();
这个例子修复了前面例子的问题,但我们根本不使用接口。
我的问题是,如果我可以在没有接口的情况下实现松散耦合,为什么还要使用接口?在上述情况下,接口会提供什么好处?或者如果我在上面的例子中不使用接口会遇到什么问题?
感谢您的帮助。
【问题讨论】:
-
而且通过你的方法,每次你想要一个像三角形、梯形或五边形这样的新形状时,你都必须重写 Creator 的 constructor() 方法代码......松耦合意味着 不必重写 Creator 代码,只需创建一个实现 Shape 的新类
-
@MarkBaker 你错了。我将拥有一个创作者,我可以拥有成千上万的客户。重写一个创作者或一千个客户哪个更好?
-
@JayBhatt 这毫无意义。
-
接口与您在 Creator 类中尝试完成的任务没有任何关系。您正在尝试开发一个系统来将字符串值映射到类实现。与接口唯一相关的是生成的类应该实现接口。
-
这是一种简化的服务定位策略,但恕我直言,我认为它的可扩展性不足以处理 1000 种类型而不会造成维护的噩梦。其他实现使用某种配置文件将字符串映射到类实现。关键是Creator出来的东西应该实现需要的接口。
标签: php oop design-patterns architecture