Modo de estratégia de programação em modo Delphi
Liu Yi
1.1 Explicação do modo
O objetivo do padrão Strategy é definir um conjunto de algoritmos e encapsular cada algoritmo em uma classe independente com uma interface comum para que possam ser substituídos entre si. O padrão Strategy permite alterações de algoritmo independentes do cliente que o utiliza. Para entender a motivação e o significado do uso do Padrão Estratégia, temos que começar com um exemplo interessante. Em um sistema de gerenciamento de materiais, os módulos de saída e entrada são as partes principais do sistema (tomaremos a saída como exemplo para análise abaixo). Para programadores que não têm experiência em programação orientada a objetos, eles geralmente colocam toda a lógica do pedido de saída no cliente (interface de pedido de saída) e usam instruções de ramificação condicionais no cliente para determinar se o tipo de pedido de saída é selecionado. emprestar materiais ou relatar perdas, a fim de escolher diferentes métodos de liquidação de saída, conforme mostrado na Figura 1-1. Como resultado, o código do cliente torna-se complexo e difícil de manter. Por exemplo: quando você precisa adicionar um novo tipo de ordem de transferência fora do armazém, você precisa modificar as condições de julgamento, recompilar e publicar o cliente. À medida que a situação se torna cada vez mais complexa, haverá cada vez mais ramificações condicionais e cada vez mais códigos de programa serão adicionados. Isso tornará o cliente maior e mais difícil de manter, e a possibilidade de influência mútua e erros aumentará. . Figura 1-1 O módulo de saída projetado com base no pensamento orientado a processos Se analisado usando o pensamento orientado a objetos, a lista de seleção, a lista de empréstimos e o relatório de perdas podem ser considerados classes derivadas da nota de saída, conforme mostrado na Figura 1-. 2 Mostrar. Dessa forma, o documento de saída serve como uma classe base de documento para fornecer uma interface comum para documentos, e a herança é usada para implementar diferentes comportamentos de saída em subclasses. Na verdade, isso faz uso de um conceito importante na orientação a objetos: polimorfismo. Mas ainda há uma lacuna neste design: o ambiente e o comportamento estão intimamente ligados. Em outras palavras, o documento e o algoritmo de saída específico estão intimamente ligados. O forte acoplamento impede que os dois evoluam de forma independente, limitando a reutilização e a escalabilidade. A Figura 1.3 mostra o módulo de saída redesenhado usando o padrão de estratégia. O objeto de documento de saída refere-se ao objeto de política de saída por meio de um objeto de operação de saída (ou seja, Contexto no modo estratégico). Várias estratégias de saída específicas são implementadas por classes derivadas da classe de estratégia de saída. O documento de saída pode fornecer um método de liquidação de saída e uma interface de exibição de documento por operação de saída e estilo de documento, respectivamente. Dessa forma, o modo estratégico separa o comportamento de saída do ambiente de documento de saída, e o aumento, diminuição ou modificação do algoritmo de saída não afetará o ambiente e o cliente. Figura 1-2 Módulo de saída projetado com base no pensamento orientado a objetos Figura 1-3 Módulo de saída projetado com base no pensamento de padrão de design A vantagem do padrão de estratégia é a separação do algoritmo e do ambiente, e os dois podem evoluir independentemente. Para ilustrar melhor os benefícios da separação entre algoritmos e ambientes, poderíamos também observar o projeto da Figura 1.4. Neste design, não há conceito de módulos de saída e entrada, porque abstraio todos os documentos de saída/entrada e combino dinamicamente a interface e o comportamento dos documentos durante o tempo de execução. Através da classe de operação de saída/entrada, diferentes classes de comportamento podem ser mantidas, consultadas e configuradas. O comportamento de saída/entrada abstraído encapsula seu algoritmo correspondente na forma de uma classe de estratégia para completar as operações de diferentes tipos de documentos de entrada e saída. Obviamente, isso melhora a capacidade de reutilização e escalabilidade do sistema e reduz a dificuldade de manutenção. Figura 1-4 A vantagem do padrão de estratégia é a separação do algoritmo e do ambiente. Os dois podem evoluir independentemente. Pode-se observar que o padrão de estratégia é adequado para as seguintes situações: · Quando existe a diferença entre muitas classes relacionadas. apenas em seu comportamento. O padrão Strategy permite que um objeto escolha dinamicamente um comportamento entre muitos. · Quando existem vários algoritmos alternativos para atingir um objetivo, como aqueles que você define com base em diferentes compensações (ou seja, aplicando estratégias diferentes). Esses algoritmos específicos podem ser encapsulados em classes derivadas da classe de algoritmo abstrato e desfrutar da interface unificada da classe de algoritmo abstrato. Através do polimorfismo, o cliente pode escolher qualquer algoritmo específico, desde que contenha um objeto de uma classe de algoritmo abstrata. · Quando um algoritmo utiliza dados que não estão disponíveis para o cliente. Usar o padrão Strategy evita a exposição de estruturas de dados complexas relacionadas a algoritmos. Na verdade, o cliente não precisa conhecer o conhecimento e os dados relacionados ao algoritmo. · Quando uma definição de classe tem muitos comportamentos e múltiplas instruções condicionais são usadas para determinar a seleção desses comportamentos. O padrão de estratégia pode transferir esses comportamentos para as classes de estratégia específicas correspondentes, evitando assim múltiplas seleções condicionais que são difíceis de manter e incorporando ideias de programação orientada a objetos.
1.2 Estrutura e uso
A estrutura do padrão de estratégia é mostrada na Figura 1-5, que inclui os seguintes participantes: · Estratégia abstrata (TStrategy) - declara uma interface comum para todos os algoritmos suportados. TContext utiliza esta interface para chamar algoritmos definidos e encapsulados por TConcreteStrategy. · Estratégia Concreta (TConcreteStrategy) - encapsula algoritmos ou comportamentos específicos. Implemente a interface TStrategy. · Contexto (TContext) – contém uma referência ao TStrategy. Chame a interface TStrategy para configurar dinamicamente algoritmos ou comportamentos específicos. Figura 1-5 Estrutura do padrão estratégico No padrão estratégico, o algoritmo selecionado é implementado através da interação de TStrategy e TContext. Quando o algoritmo é chamado, o TContext pode passar todos os dados exigidos pelo algoritmo para o TStrategy. Alternativamente, o TContext pode passar como parâmetro para a operação TStrategy. Quando um TContext encaminha uma solicitação do cliente para seu TStrategy, o cliente normalmente cria e passa um objeto TConcreteStrategy para o TContext, desta forma, o cliente interage apenas com o TContext; Geralmente há uma série de classes TConcreteStrategy que os clientes podem escolher. -------------------------------------------------- ----------------------------------------
Mais artigos relacionados e exemplos de códigos-fonte de programas podem ser baixados do site do autor: http://www.liu-yi.net