原型模式,为什么我需要一个接口



我正在处理设计模式,而我正在使用原型模式。模式让我感到奇怪,为什么我需要这个模式的接口,如果没有接口,我不能实现相同的功能?

我创建了两个示例,谁能解释我为什么需要接口?

接口示例:

这是我的接口类:

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!");
    }
}

将其定义,我可以定义任意数量的武器,每种武器都会为我提供最低的班级内容。真正的优势是每个人都以自己独特的方式实现这些方法。

将接口像一组相关类的模板一样。

最新更新