Ответ , это зависит от того, что вы хотите, чтобы произошло .
Технически вы можете сделать три вещи:
- Ничего не копировать. Любые наблюдатели ничего не будут знать о новом объекте.
- Пусть новый объект добавит себя в список того, что наблюдают старые наблюдатели. Существующие наблюдатели будут реагировать на новый объект так же, как и на старый.
- Создайте новых наблюдателей, которые будут наблюдать новый объект, так же, как старые сделали старый объект. Новые наблюдатели будут реагировать на изменения в новом объекте так же, как старые реагировали на старый объект.
Другие авторы, безусловно, правы, что 1), вероятно, будет предпочтительным вариантом, хотя бы потому, что выполнение 2 или 3 в конструкторе копирования означает, что наблюдатели всегда создаются / копируются. Бездействие позволяет добавлять наблюдателей позже, если это необходимо.
Однако можно представить случаи, когда другие варианты верны. Если вы хотите, чтобы наблюдатель отвечал на любой экземпляр данного класса, независимо от того, как он был создан, то 2) является правильным. Если ваш наблюдатель выполняет определенную задачу для объекта и не заботится об остальной части системы, тогда 3) может быть правильным.
Часто лучше подумать о том, как работает ваша система, чем просто следовать правилу. Если это не ваш код, который вы изменяете, спросите владельца. А если вы просто не знаете, чего хотите, выберите 1) и добавьте наблюдателей позже.