Как использовать Стратегическую модель с C#?

Вот то, что я имею до сих пор:

namespace Strategy
{
    interface IWeaponBehavior
    {
        void UseWeapon();
    }
}

namespace Strategy
{
    class Knife : IWeaponBehavior
    {
        public void UseWeapon()
        {
            Console.WriteLine("You used the knife to slash the enemy! SLASH SLASH!");
        }
    }
}

namespace Strategy
{
    class Pan : IWeaponBehavior
    {
        public void UseWeapon()
        {
            Console.WriteLine("You use the pan! 100% Adamantium power! BONG!");
        }
    }
}

Теперь, если у меня есть суперкласс Character.cs. как тот суперкласс может реализовать weaponbehavior так, чтобы дочерние классы могли быть более конкретными.

namespace Strategy
{
    class Character
    {
        public IWeaponBehavior weapon;

        public Character(IWeaponBehavior specificWeapon)
        {
            weapon = specificWeapon;
        }        
    }
}

namespace Strategy
{
    class Thief : Character
    {

    }
}

Как я могу реализовать это? Я очень смущен на том, каков фактический код должен быть.

Я знаю, что это могло бы спрашивать слишком много, но если Вы могли бы написать фактический код, таким образом, я мог изучить его, который будет очень хорош из Вас парни. Я учусь путем наблюдения кода.:P Многие люди могли извлечь выгоду из этого вопроса.

16
задан Sergio Tapia 10 August 2010 в 14:13
поделиться

7 ответов

Использовать внедрение зависимостей в классе Символ ?

public class Character
{
    public Character(IWeaponBehavior weapon) 
    {
        this.weapon = weapon;
    }

    public void Attack()
    {
        weapon.UseWeapon();
    }

    IWeaponBehavior weapon;
}

public class Princess: Character
{
    public Princess() : base(new Pan()) { }
}

public class Thief: Character
{
    public Thief() : base(new Knife()) { }
}

...

Princess p = new Princess();
Thief t = new Thief();

p.Attack(); // pan
t.Attack(); // knife

Отредактировано по запросу.

26
ответ дан 30 November 2019 в 16:49
поделиться
public class Character
{
    IWeaponBehavior Weapon;
}

public class Princess : Character
{
    Weapon = new Pan();
}

public class Thief : Character
{
    Weapon = new Knife();
}
1
ответ дан 30 November 2019 в 16:49
поделиться

Взгляните на внедрение зависимостей, а затем также посмотрите на инверсию управления.

В TekPub есть отличная бесплатная серия по этим двум идеям, в которой используется образец, очень похожий на ваш. Это должно помочь вам с конкретным образцом. : -)

http: // tekpub.com / view / concepts / 1

Пример кода из видео:

class Samurai {
  IWeapon _weapon;

  public Samurai() {
   _weapon = new Sword();
  }

  public Samurai(IWeapon weapon) {
   _weapon = weapon;
  }

  public void Attack(string target) {
    _weapon.Hit(target);
  }
}

Выше показан DI (с конструктором IWeapon). Теперь, добавив инверсию управления, вы получите еще больший контроль.

Используя контейнер IOC, вы сможете управлять IWeapon посредством инъекции, а не в самом классе.

В видео используется NInject как IOC и показано, как можно исключить конструктор IWeapon и получить контроль над классом и всеми классами, которым необходимо использовать IWeapon для использования того, что вы хотите, в одной области расположения / конфигурации.

Пример из видео:

class WarriorModule: NinjectModule {
  public override void Load() {
   Bind<IWarrior>().To<Samurai>();
   Bind<IWeapon>().To<Sword>();
}

Вышеупомянутая конфигурация сообщает NInject, что всякий раз, когда он встречает IWarrior использовать Samurai, и всякий раз, когда он призывает IWeapon использовать Sword.

Видео продолжает объяснять, как это небольшое изменение увеличивает вашу гибкость. Он добавляет еще один модуль для Самурии, использующей оружие дальнего боя и т. Д.

Вы можете изменить их по необходимости / желанию.

1
ответ дан 30 November 2019 в 16:49
поделиться

Вот очень конкретная статья об использовании этого шаблона в C #: http://www.lowendahl.net/showShout.aspx?id=115

0
ответ дан 30 November 2019 в 16:49
поделиться

Если у всех ваших персонажей есть собственное определенное оружие, вам на самом деле не нужно использовать шаблон стратегии. Вы можете использовать простой полиморфизм. Но шаблон стратегии в любом случае мог бы быть чище.

Вам просто нужно инициализировать оружие:

public class Character
{
     IWeapenBehavior weapon;

     public Attack()
     {
          weapon.UseWeapon();
     }
}


public class Thief : Character
{
      Thief()
      {
           weapon = new Knife();
      }
}

В коде, который управляет вашими персонажами, вы можете вызвать метод Attack () .

0
ответ дан 30 November 2019 в 16:49
поделиться

Есть несколько вариантов. На самом деле вы спрашиваете: "Как конкретный персонаж должен знать, какое оружие использовать?".

Вы можете либо создать фабрику персонажей, которая будет создавать и вводить нужный тип оружия в персонажа (это звучит неправильно :) ), либо позволить конструктору конкретного персонажа позаботиться о создании оружия.

5
ответ дан 30 November 2019 в 16:49
поделиться
  class Character
  {
    private IWeaponBehavior _weapon;

    // Constructor
    public Character(IWeaponBehavior strategy)
    {
      this._weapon = strategy;
    }

    public void WeaponInterface()
    {
      _weapon.UseWeapon();
    }
  }
3
ответ дан 30 November 2019 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: