Определяющим отличием является то, что Посетитель предлагает другое поведение для подклассов элемента, используя перегрузку операторов.Он знает, над чем работает или посещает.
Стратегия, тем временем, будет иметь согласованный интерфейс для всех своих реализаций.
Посетитель используется, чтобы позволить частям объекта использовать согласованные средства для выполнения чего-либо.Стратегия используется, чтобы разрешить внедрение зависимости от того, как что-то сделать.
Так что это будет посетитель:
class LightToucher : IToucher{
string Touch(Head head){return "touched my head";}
string Touch(Stomach stomach){return "hehehe!";}
}
с другим типом
class HeavyToucher : IToucher{
string Touch(Head head){return "I'm knocked out!";}
string Touch(Stomach stomach){return "oooof you bastard!";}
}
У нас есть класс, который затем может использовать этого посетителя для выполнения своей работы и изменять его в зависимости от него:
class Person{
IToucher visitor;
Head head;
Stomach stomach;
public Person(IToucher toucher)
{
visitor = toucher;
//assume we have head and stomach
}
public string Touch(bool aboveWaist)
{
if(aboveWaist)
{
visitor.Touch(head);
}
else
{
visitor.Touch(stomach);
}
}
}
Так что, если мы сделаем это, var person1 = new Person (new LightToucher ());var person2 = new Person (новый HeavyToucher ());
person1.Touch(true); //touched my head
person2.Touch(true); //knocked me out!