Executando verificação de segurança...
1

Muito interessante, mas fiquei com dúvida em como que exatamente os ifs aninhados vão ser eliminados, pois, ainda assim na função main do seu código é necessário passar o Objeto que será referente a qual transportadora eu irei usar e é exatamente ai que entra minha dúvida, pois vejo que ainda seria necessário um if para saber qual transportadora que será enviada para a classe de contexto, por exemplo:

TransportationContext transportationContext = null;

if(type == "DHL") { 
    transportationContext = new(new DHL());
} ...

Dando uma olhada no Refactoring Guru o exemplo de pseudocódigo que é usado faz exatamente isso que mostrei acima, portanto, mesmo após o uso do Strategy a classe ainda continuaria violando o OCP (Open Closed Principle), pois caso tivesse uma nova transportadora teria que modificar minha classe e adicionar uma condição para ela.

Carregando publicação patrocinada...
1

Bom... uma forma que pode ajudar na sua duvida? É criar uma classe com dois metodos: um que seja no estilo chave e valor. Eu utilizo um Dictionary onde a chave vai ser um string ou qualquer outro tipo e o value vai ser a interface ITransportationStrategy e o outro metodo para obter o valor.

Ex:

public static class SearchTransport
{
    private static IDictionary<string, ITransportationStrategy> strategy = new 
    Dictionary<string, ITransportationStrategy> 
    {
         {"SEDEX", new Sedex()},
         {"JADLOG", new JadLog()},
         {"DHL", new DHL()}
    };

    public static ITransportationStrategy Get(string transport) =>
        strategy[transport];
}

Então você pode receber qual tipo de frete voce quer dinamicamente...

TransportationContext transportationContext = new(SearchTransport.Get("SEDEX"));