Переключатели поведения не так легко понять, как подклассы, в общем, поэтому я бы предпочел отдать предпочтение подклассам. Я не буду беспокоиться об отсутствии будущих подклассов. Вероятно, лучший способ сделать это - иметь базовый класс Server с подклассами Secure и Insecure (или как вы хотите их называть).
Помните принцип Лискова: TCPSecure должен быть заменой TCPServer, поскольку он будет делать все, что TCPServer будет делать с точки зрения программирования. Он не должен делать это таким же образом, и фактически может блокировать определенное поведение пользователя, но код, вызывающий его, не должен знать, а вызывающие функции не должны давать неожиданные результаты.
Другая проблема заключается в том, что безопасность - это не просто быстрое дополнение. Требует внимания ко всей системе. Я думаю, что это способствует созданию подклассов, поскольку все безопасное поведение помещается в одном месте. Если вы перейдете с переключателем поведения, я бы посоветовал, чтобы каждая функция содержала документ о том, что он делает по-другому, с установленным на него безопасным или небезопасным.