Я думаю, что вы хотите создать класс с именем «Подписка», который представляет отдельную подписку от исполнителя до менеджера, содержащую информацию о том, при каких условиях будет вызываться эта подписка, а также какой-либо GUID или имя для этой подписки. , Я думаю что-то вроде
class Subscription
{
GUID g;
A_filter a;
B_filter b;
Executor *e;
}
В подписке также есть метод «Проверить», должен ли он срабатывать на основе заданных значений для A и B, а затем вызывать исполнителя по этим параметрам, если он совпадает.
В этом случае класс Manager будет содержать три карты, одна из которых является «Руководством по картам для подписки» *, и позволит очень быстро отписываться, в основном ищет GUID в запросе отказа от подписки, чтобы получить объект подписки, используйте этот объект, чтобы определить, какие значения для Возможно, потребуется удалить A и B с карты A и B, а затем удалить объект. Подписаться - это просто создание объекта подписки и добавление значений на карту Guid, A Map и B Map.
Выполняя поиск на основе (A, B), если A или B имеет значение NULL, вы выполняете поиск в другой хэш-таблице и запускаете возвращаемую подписку. Если ни A, ни B не равны нулю, все становится сложнее.
Здесь нужно найти пересечение наборов, возвращаемых путем поиска A и поиска B. Это можно сделать вручную, но более быстрый способ может заключаться в том, чтобы иметь одну дополнительную карту, ключ которой B добавлен к A.