История изменений
Исправление AndreyKl, (текущая версия) :
ха, случается)
на самом деле идея простая: есть набор операций и набор объектов (например, умножение и сложение и числа). Но операция зависит от объекта (умножение и сложение разные для обынчых и комплексных чисел). Визитор нужен чтобы добавлять операции не трогая объекты.
смотри
у тебя есть числа - комплексные и обычные. ты их загоняешь в список.
и ты хочешь с ними что то делать, то ли возводить в квадрат, то ли складывать с собой.
для этого описываешь два класса для чисел. потом проходишься по массиву и делаешь accept
// если хочешь сложить с собой
operator = new SlogiSSoboy
foreach(arr as c) c.doOperation(operator)
// если хочешь возвести в квадрат
operator = new VozvediVKvadrat
foreach(arr as c) c.doOperation(operator)
а внутри чисел
// внутри обычного числа
doOperation = function(visitor) {
visitor.operiruiSObichnim(this)
}
-----
// внутри комплексного числа
doOperation = function(visitor) {
visitor.operiruiSComplexnym(this)
}
и тут ты понимаешь, что хотел бы добавить ещё и деление на себя. и ты нре хочешь трогать иерархию чисел (трудозатратно). поэтому ты создаёшь новый визитор. создаёшь у него два метода
operiruiSObichnim
и operiruiSKompleksnim
и просто посылаешь этот визитор по своей иерархии в нужный момент. получилось что ты основную иерархию (числа в нашем случае) не трогал, а операцию добавил.Исправление AndreyKl, :
ха, случается)
на самом деле идея простая: есть набор операций и набор объектов (например, умножение и сложение и числа). Но операция зависит от объекта (умножение и сложение разные для обынчых и комплексных чисел). Визитор нужен чтобы добавлять операции не трогая объекты.
смотри
у тебя есть числа - комплексные и обычные. ты их загоняешь в список.
и ты хочешь с ними что то делать, то ли возводить в квадрат, то ли складывать с собой.
для этого описываешь два класса для чисел. потом проходишься по массиву и делаешь accept
// если хочешь сложить с собой
operator = new SlogiSSoboy
foreach(arr as c) c.doOperation(operator)
// если хочешь возвести в квадрат
operator = new VozvediVKvadrat
foreach(arr as c) c.doOperation(operator)
а внутри чисел
// внутри обычного числа
doOperation = function(visitor) {
visitor.operiruiSObichnim(this)
}
-----
// внутри комплексного числа
doOperation = function(visitor) {
visitor.operiruiSComplexnym(this)
}
и тут ты понимаешь, что хотел бы добавить ещё и деление на себя. и ты нре хочешь трогать иерархию чисел (трудозатратно или вообще исходников нет, только интерфейс известен). поэтому ты создаёшь новый визитор. создаёшь у него два метода
operiruiSObichnim
и operiruiSKompleksnim
и просто посылаешь этот визитор по своей иерархии в нужный момент. получилось что ты основную иерархию (числа в нашем случае) не трогал, а операцию добавил.Исходная версия AndreyKl, :
ха, случается)
на самом деле идея простая: есть набор операций и набор объектов (например, умножение и сложение и числа). Но операция зависит от объекта (умножение и сложение разные для обынчых и комплексных чисел). Визитор нужен чтобы добавлять операции не трогая объекты.
смотри
у тебя есть числа - комплексные и обычные. ты их загоняешь в список.
и ты хочешь с ними что то делать, то ли возводить в квадрат, то ли складывать с собой.
для этого описываешь два класса для чисел. потом проходишься по массиву и делаешь accept
// если хочешь сложить с собой
operator = new SlogiSSoboy
foreach(arr as c) c.doOperation(operator)
// если хочешь возвести в квадрат
operator = new VozvediVKvadrat
foreach(arr as c) c.doOperation(operator)
а внутри чисел
// внутри обычного числа
doOperation = function(visitor) {
visitor.operiruiSObichnim(this)
}
-----
// внутри комплексного числа
doOperation = function(visitor) {
visitor.operiruiSComplexnym(this)
}
и тут ты понимаешь, что хотел бы добавить ещё и деление на себя. и ты нре хочешь трогать иерархию чисел (трудозатратно). поэтому ты создаёшь новый визитор. создаёшь у него два метода
operiruiSObichnim
и operiruiSKompleksnim
и просто посылаешь этот визитор по своей иерархии в нужный момент. получилось что ты основную иерархию (числа в нашем случае) не трогал, а операцию добавил.