我需要了解如何在项目上使用策略设计 PHP 项目?
I need to understand how to use a strategy design on a project PHP Project?
Note: it's a PHP Project
我的项目使用了 2 个 API 提供商。
它们类似于它们 (API) 提供的信息。
我必须设置正确的方式,因为明天可能会添加更多 APIs。
所以我的项目需要一些方法。
基本,这是我目前所拥有的:
abstract class A {}// first api class, mostly contains API configs and call
abstract class B {}// second api class, also mostly contains API configs and call
//than first API has a sub classes of something like cars and trucks
class Car extends A implements ApiMethodsInterface {} // for the cars
class Truck extends A implements ApiMethodsInterface {} // for the trucks
//now second API has a sub classes for cars , trucks and spaceships
class Car extends B implements ApiMethodsInterface {} // for the cars
class Truck extends B implements ApiMethodsInterface {} // the trucks
class SpaceShip extends B implements ApiMethodsInterface {} // for the space ships
//they all have more or less similar methods
// so i used an Interface that all above classes
interface ApiMethodsInterface
//methods are
public function getModels()
public function getYears()
public function getPrice()
因为每个子 class 实现这个接口,我按接口编码
现在,我有一种情况,SpaceShips 有更多方法可以添加,例如 getEquipment() 和一些更多信息,其他 classes 没有实现的方法。
Trucks 还有更多其他方法没有实现的方法,例如 hasTrailer()、trailerLength() 等...
我的问题是,现在该怎么办,我是否应该使用接口隔离,并将接口添加到实现这些方法的 classes,然后检查实例化的对象是否具有此方法而不是 运行, 否则一些例外,或者将缺失的模型添加到抽象 classes A 和 B 中,并将方法覆盖到使用这些方法的 classes 中,或者也许有更好的解决方法这个。对设计模式还很陌生...
也许我设计过度了,但我真的想以一种好的方式做到这一点。
谢谢
它可能会帮助你画一个图表,但我们可以通过它来讨论。
一个接口的不同实现者拥有其他人没有的方法是完全正常的。该接口指定了所有实现者共同共享的方法,当您对接口进行编码时,您只需调用这些方法,而不是 class 也可能声明的其他方法。 iterface 的任何实现都可以与任何其他实现互换使用。客户端不关心实现者还有什么其他方法,它只对使用接口方法感兴趣。
但不充当接口客户端的代码可能会以完全不同的方式查看实现。其他一些代码可能会构造一个新的 SpaceShip 并调用 getSpaceEquipment()。这也很正常。如果你建造一辆新卡车,那么你不能调用 getSpaceEquipment() 因为 class 没有那个方法。
将 getSpaceEquipment() 之类的方法添加到 Truck 和 SpaceShip 都实现的接口中是错误的,比如 Vehicle。 getSpaceEquipment() 仅对 SpaceShip 有意义,不适用于所有载具。
您可以创建一个名为 SpaceVehicle 的 Vehicle 扩展,并在其中声明 getSpaceEquipment() 方法。然后 SpaceShip 可以实现 SpaceVehicle(这也使它通过继承成为一个 Vehicle)。但是,只有当您要拥有多个 SpaceVehicle 实现者并且您需要编写适用于 SpaceVehicle 实例但不关心 SpaceVehicle 是 SpaceShip 还是 Satelite 或其他什么的代码时,您才会这样做。
Note: it's a PHP Project
我的项目使用了 2 个 API 提供商。 它们类似于它们 (API) 提供的信息。 我必须设置正确的方式,因为明天可能会添加更多 APIs。 所以我的项目需要一些方法。 基本,这是我目前所拥有的:
abstract class A {}// first api class, mostly contains API configs and call
abstract class B {}// second api class, also mostly contains API configs and call
//than first API has a sub classes of something like cars and trucks
class Car extends A implements ApiMethodsInterface {} // for the cars
class Truck extends A implements ApiMethodsInterface {} // for the trucks
//now second API has a sub classes for cars , trucks and spaceships
class Car extends B implements ApiMethodsInterface {} // for the cars
class Truck extends B implements ApiMethodsInterface {} // the trucks
class SpaceShip extends B implements ApiMethodsInterface {} // for the space ships
//they all have more or less similar methods
// so i used an Interface that all above classes
interface ApiMethodsInterface
//methods are
public function getModels()
public function getYears()
public function getPrice()
因为每个子 class 实现这个接口,我按接口编码
现在,我有一种情况,SpaceShips 有更多方法可以添加,例如 getEquipment() 和一些更多信息,其他 classes 没有实现的方法。 Trucks 还有更多其他方法没有实现的方法,例如 hasTrailer()、trailerLength() 等...
我的问题是,现在该怎么办,我是否应该使用接口隔离,并将接口添加到实现这些方法的 classes,然后检查实例化的对象是否具有此方法而不是 运行, 否则一些例外,或者将缺失的模型添加到抽象 classes A 和 B 中,并将方法覆盖到使用这些方法的 classes 中,或者也许有更好的解决方法这个。对设计模式还很陌生...
也许我设计过度了,但我真的想以一种好的方式做到这一点。
谢谢
它可能会帮助你画一个图表,但我们可以通过它来讨论。
一个接口的不同实现者拥有其他人没有的方法是完全正常的。该接口指定了所有实现者共同共享的方法,当您对接口进行编码时,您只需调用这些方法,而不是 class 也可能声明的其他方法。 iterface 的任何实现都可以与任何其他实现互换使用。客户端不关心实现者还有什么其他方法,它只对使用接口方法感兴趣。
但不充当接口客户端的代码可能会以完全不同的方式查看实现。其他一些代码可能会构造一个新的 SpaceShip 并调用 getSpaceEquipment()。这也很正常。如果你建造一辆新卡车,那么你不能调用 getSpaceEquipment() 因为 class 没有那个方法。
将 getSpaceEquipment() 之类的方法添加到 Truck 和 SpaceShip 都实现的接口中是错误的,比如 Vehicle。 getSpaceEquipment() 仅对 SpaceShip 有意义,不适用于所有载具。
您可以创建一个名为 SpaceVehicle 的 Vehicle 扩展,并在其中声明 getSpaceEquipment() 方法。然后 SpaceShip 可以实现 SpaceVehicle(这也使它通过继承成为一个 Vehicle)。但是,只有当您要拥有多个 SpaceVehicle 实现者并且您需要编写适用于 SpaceVehicle 实例但不关心 SpaceVehicle 是 SpaceShip 还是 Satelite 或其他什么的代码时,您才会这样做。