LINUX.ORG.RU

История изменений

Исправление 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 и просто посылаешь этот визитор по своей иерархии в нужный момент. получилось что ты основную иерархию (числа в нашем случае) не трогал, а операцию добавил.