Что это за шаблон проектирования, используемый в Enumerator? - PullRequest
0 голосов
/ 28 июня 2010

Я видел этот шаблон в Enumerator.Он гарантирует, что коллекция не была изменена при перечислении элементов.

public class Versioned
{
    internal int version = 0;

    public void ThisBreaksVersion()
    {
        version++;
    }
}

public class WorksOnVersioned
{
    private readonly int version;
    private readonly Versioned versioned;

    public WorksOnVersioned(Versioned versioned)
    {
        this.versioned = versioned;
        this.version = versioned.version;
    }

    public void DoWork()
    {
        if( version != other.version )
            throw new Exception(); // Ooop.. Out of sync!
    }
}


var v1 = new Versioned();
var w1 = WorksOnVersioned(v1);
w1.DoWork(); // Yup

var v2 = new Versioned();
var w2 = WorksOnVersioned(v2);
v2.ThisBreaksVersion();
w2.DoWork(); // v2 has changed -> exception!

Я также вижу, что это полезно при использовании общего ресурса, чтобы убедиться, что локальная копия такая же, какресурс.

Но как называется этот шаблон?Есть ли что-то еще, для чего это может быть полезно?

1 Ответ

3 голосов
/ 28 июня 2010

Я не знаю ни одного именованного шаблона для этого - вы можете назвать его «моментальным снимком версии» или что-то в этом роде, где важной частью является то, что вам не нужно снимать весь изменяемые данные, если все, что вас интересует - это знать, изменились они или нет. (то есть снимок просто становится недействительным, а не остается неизменным перед лицом изменений в оригинале.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...