我正在处理设计模式,而我正在使用原型模式。模式让我感到奇怪,为什么我需要这个模式的接口,如果没有接口,我不能实现相同的功能?
我创建了两个示例,谁能解释我为什么需要接口?
接口示例:
这是我的接口类:
interface IWeapon
{
IWeapon Clone();
}
我的具体类:
class Rifle : IWeapon
{
public IWeapon Clone()
{
return (IWeapon)this.MemberwiseClone();
}
}
克隆过程
//Create rifle
Rifle rifle = new Rifle();
rifle.Name = "M4A1";
rifle.Rounds = 30;
//Copy Rifle
Rifle rifleCopy = (Rifle)rifle.Clone();
这就是我在没有接口的情况下克隆的方式
public Rifle Clone()
{
return (Rifle)this.MemberwiseClone();
}
有人可以向我解释在没有接口上的接口上使用实现的优势吗?
界面在您的类做同样的事情时很棒,但是使用不同的方法来实现它。
使用您的示例,可以说我们有类似的东西...
public interface ILongRangeWeapon
{
void Fire();
}
现在,可以说您有这些课...
public class Rifle : ILongRangeWeapon
{
public void Fire()
{
// Pull the trigger
}
}
public class NuclearMissile : ILongRangeWeapon
{
public void Fire()
{
// Press the red button
}
}
现在您可以在代码中使用iLongrangeweapon,并且它用哪种机制发射都没关系,它只是知道它可以发射。
更实用的应用程序将连接到Internet。有多种连接,调制解调器,LAN,WiFi等的方法。但是,您甚至不在乎实例如何连接,您只是希望它连接。
有些纯粹主义者说您应该使所有内容成为接口。我认为它仅仅是为了增加复杂性而增加了不需要的复杂性。作为开发人员决定是否应该使用接口。
原型图案中的接口看起来更像是这样:
interface ICloneable
{
ICloneable Clone();
}
即。您不使用界面将类标记为武器,而是使用它来标记它具有可用于创建副本的Clone
方法。
假设您有一种方法:
public void CloneAndShoot(IWeapon weapon) {
IWeapon cloned = weapon.clone();
cloned.shoot();
}
现在,如果您的界面被定义如下:
interface IWeapon {
IWeapon clone();
void shoot();
}
您的方法可以在不关心的情况下接受各种武器:
CloneAndShoot(new M16());
CloneAndShoot(new M4A4());
avoid subclasses of an object creator in the client application, like the abstract factory pattern does.
https://en.wikipedia.org/wiki/prototype_pattern
interface
的点是定义类的常见且可强制执行的结构。
在您的示例中,优点并不明显,因为您仅声明了一种IWeapon
。当您开始创建不同的武器时,真正的优势出现了。
IWeapon
类可以定义您从每种武器 中的期望,这样您创建的每个武器类都被迫遵循IWeapon
的继承。
最终,就您期望的方法而言,这是可以预测的。但是,这些方法的作用是每种武器所独有的。
一个例子:
interface IWeapon
{
IWeapon Clone();
Boolean HasAmmo();
Int32 RoundInMagazine();
Double GetCaliber();
Fire();
//etc.
}
//1st weapon
public class Shotgun : IWeapon
{
private Int32 _ammo = 5;
public void Clone()
{
return (IWeapon)this.MemberwiseClone();
}
public Boolean HasAmmo()
{
return _ammo > 0;
}
public Int32 RoundsInMagazine()
{
return _ammo;
}
public Double GetCaliber()
{
return 12.0;
}
public void Fire()
{
MessageBox.Show("bang!");
}
}
//1st weapon
public class Rifle : IWeapon
{
private Int32 _ammo = 30;
public void Clone()
{
return (IWeapon)this.MemberwiseClone();
}
public Boolean HasAmmo()
{
return _ammo > 0;
}
public Int32 RoundsInMagazine()
{
return _ammo;
}
public Double GetCaliber()
{
return 5.56;
}
public void Fire()
{
MessageBox.Show("bang! bang! bang!");
}
}
将其定义,我可以定义任意数量的武器,每种武器都会为我提供最低的班级内容。真正的优势是每个人都以自己独特的方式实现这些方法。
将接口像一组相关类的模板一样。