Option one. You have a Foo call bar when it is updated and a Bar Spam call. This will result in tightly coupled objects, and you will probably also need to return Spam back to Bar, which will call Foo back to synchronize in the other direction, yuk.
. , , . ( )
- , <Bar> , List <Foo> List <string> . , ( ) .
4. - , .
EDIT. , , , , . , , .