вопрос принимает контекст ответа и, следовательно, создает ложную дилемму
«загадка электронной таблицы» в данном примере является ложной дихотомией: строки и столбцы являются уровнем представления, а не обязательно уровнем данных. Комментарии ниже говорят мне, что я неправильно понял аналогию, но я так не думаю - говоря «если это строка или столбец, который с большей вероятностью изменится», вынуждает делать ненужный выбор в проблемном пространстве - они оба с одинаковой вероятностью может измениться. И в этом конкретном примере это приводит к выбору неправильной [да неправильной ] парадигмы для решения. Набор номера телефона - это то, как старые механические устройства инициировали соединение с другим старым механическим устройством; это вряд ли удачная аналогия для современной телефонии. И если предположить, что есть «пользователь», который инициирует вызов, просто перемещает проблему - хотя он перемещает ее в правильном направлении, то есть от модели телефона с поворотным механизмом; -)
Если вы посмотрите, как работает протокол TAPI [извините за опечатку ранее, это протокол TAPI, а не ATAPI!], То есть контроллер вызовов - эквивалент «пользователя», который, я полагаю, в некотором смысле - который управляет соединениями между устройствами. , Одно устройство не вызывает другое, контроллер вызовов подключает устройства. Таким образом, приведенный ниже пример по-прежнему верен. Возможно, было бы правильнее использовать объект CallController вместо общего соединения, но аналогия должна быть достаточно ясной.
В этом примере телефон - это устройство с адресом, называемым «номер телефона». Оператор «dial» устанавливает соединение между двумя устройствами. Итак, ответ:
Phone p1 = new Phone(phoneNumber1);
Phone p2 = new Phone(phoneNumber2);
Connection conn = new Connection(p1,p2);
conn.Open();
//...talk
conn.Close();
это также будет поддерживать многосторонние вызовы, перегружая Connection для включения списка устройств или других подключений, например,
Connection confCall = new Connection(p1,p2,p3,p4,p5,p6);
confCall.Open();
Connection joinCall = new Connection(confCall,p7,p8,conn);
joinCall.Open();
посмотрите на протокол TAPI для большего количества примеров