Definição: Defina um conjunto de algoritmos, encapsulam cada algoritmo e torne -os intercambiáveis.
Tipo: padrão comportamental
Diagrama de classe:
O padrão de política é o encapsulamento de algoritmos, encapsulando uma série de algoritmos nas classes correspondentes, e essas classes implementam a mesma interface e podem ser substituídas uma pela outra. No modo de classe comportamental mencionado acima, há um padrão que também se concentra no encapsulamento do algoritmo - o modo de método de modelo. Comparado com o diagrama de classes, você pode ver que a diferença entre o modo de política e o modo de método do modelo é apenas que existe um contexto de classe de encapsulamento separado. A diferença entre ele e o modo de método de modelo é: No modo Modelo do Método, o corpo principal do algoritmo de chamada está na classe pai abstrata, enquanto no modo de estratégia, o corpo principal do algoritmo de chamada é encapsulado no contexto da classe de encapsulamento. A estratégia abstrata da estratégia é geralmente uma interface, o objetivo é apenas definir a especificação e geralmente não contém lógica. De fato, isso é apenas uma implementação geral. Na programação real, porque há inevitavelmente uma mesma lógica entre cada classe de implementação de estratégia específica, a fim de evitar o código duplicado, geralmente usamos classes abstratas para desempenhar o papel da estratégia e encapsular o código público. Portanto, em muitos cenários de aplicação, a sombra do padrão de método de modelo é geralmente vista no modo de estratégia.
Estrutura dos padrões políticos
Classe de encapsulamento: também conhecida como contexto, o encapsulamento secundário das políticas é evitar chamadas diretas para políticas por módulos de alto nível.
Estratégia abstrata: geralmente uma interface. Quando há lógica duplicada em cada classe de implementação, as classes abstratas são usadas para encapsular essa parte do código comum. Neste momento, o padrão de política se parece mais com o padrão de método de modelo.
Estratégia específica: as funções de estratégia específicas são geralmente executadas por um conjunto de classes encapsuladas com algoritmos, e essas classes podem ser substituídas livremente conforme necessário.
Exemplos de cenários de aplicação:
Liu Bei vai se casar com sua esposa em Jiangdong. Antes de sair, Zhuge Liang deu a Zhao Yun (o melhor homem) três truques, dizendo que resolveria o difícil problema, desmontando -o de acordo com o segredo do céu. Ei, digamos, isso realmente resolveu o grande problema. No final, Zhou Yu acompanhou sua esposa e depois quebrou as tropas. Vamos primeiro ver como é essa cena.
Vamos falar sobre os elementos nesta cena: três truques inteligentes, um truque inteligente e um truque inteligente. O truque inteligente foi dado pelo irmão Liang. O truque inteligente é comumente conhecido como o truque inteligente. Então Zhao Yun é um trabalhador que tira o truque inteligente, o executa e depois vence. Como expressá -los usando programas Java?
Vamos dar uma olhada na foto primeiro?
Os três truques são o mesmo tipo de coisa, então vamos escrever uma interface:
pacote com.yangguangfu.strategy; /**** @author [email protected]: AFU* Primeiro defina uma interface de estratégia, que é a interface dos três truques que Zhuge Liang deu a Zhao Yun. */interface pública istrategy {// Todo truque é um algoritmo executável. public void Operate (); }
Em seguida, escreva três classes de implementação, existem três truques inteligentes:
Um plano inteligente: Primeira chegada a Wu:
pacote com.yangguangfu.strategy; /**** @author [email protected]: um fu* peça ao Sr. Qiao para ajudar, para que Sun Quan não possa matar Liu Bei. */ classe pública backdoor implementa a istrategy {@Override public void Operate () {System.out.println ("Procurando a ajuda da velha qiao guo, deixe Wu Guotai pressionar Sun Quan para que Sun Quan não possa matar Liu Bei ..."); }}
O segundo truque: por favor, dê uma luz verde a Wu Guotai e deixe para lá:
pacote com.yangguangfu.strategy; /**** @author [email protected]: um fu* por favor, dê uma luz verde a wu guotai. */ classe pública GivenGreenLight implementa a istrategy {@Override public void Operate () {System.out.println ("Por favor, dê uma luz verde de Wu Guotai, deixe -o ir!"); }}
Habilidade 3: a Sra. Sun corta a parte traseira e bloqueia os perseguidores:
pacote com.yangguangfu.strategy; /**** @author [email protected]: Afu* A Sra. Sun cortou a parte traseira e bloqueou os perseguidores. */ classe pública BackEnenemy implementa IStrategy {@Override public void Operate () {System.out.println ("Sra. Sun corta as costas, bloqueia os perseguidores ..."); }}
Ok, todos, existem três truques, então há um lugar para colocá -los na dica:
pacote com.yangguangfu.strategy; / ** * * @author [email protected]: Afu * */ Public Class Context {private IStrategy Strategy; // Construtor, que truque você deseja usar o contexto público (estratégia da IStrategy) {this.strategy = Strategy; } public void operate () {this.strategy.operate (); }}
Então Zhao Yun estava carregando três dicas com grande coragem, puxando o velho Liu Bei, que já havia entrado nas fileiras dos idosos e queria se casar com uma garota inocente, foi casar com sua esposa. Olá, muito menos, os três truques do irmão Liang são realmente bons. Olhar:
pacote com.yangguangfu.strategy; classe pública Zhaoyun { /*** zhao yun apareceu. De acordo com a explicação de Zhuge Liang para ele, ele desmontou os truques por sua vez*/ public estático void main (string [] args) {contexto de contexto; // Quando cheguei a Wu, desmontei o primeiro sistema.out.println ("---------------------------------------"); contexto = novo contexto (novo backdoor ()); context.operate (); // execute system.out.println ("/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n"); //When Liu Bei was happy to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be Não querendo não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar disposto a não estar desmontando o terceiro sistema de ponta. context = novo contexto (new backenemy ()); context.operate (); // desmontar e executar System.out.println("/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n
Vantagens e desvantagens do modo de política As principais vantagens do modo de política são:
As classes de políticas podem ser alteradas livremente e, como as classes de políticas implementam a mesma abstração, elas podem ser alteradas livremente.
Fácil de expandir, adicionar uma nova política é muito fácil para o modelo de política e pode basicamente ser expandido sem alterar o código original.
Evite usar várias condições. Se você não usar o modo de política, para todos os algoritmos, as declarações condicionais devem ser usadas para se conectar e o algoritmo a ser usado através do julgamento condicional. No artigo anterior, mencionamos que o uso de múltiplos julgamentos condicionais é muito difícil de manter.
Existem duas principais desvantagens do modelo de estratégia:
A manutenção de várias classes de políticas trará uma sobrecarga adicional ao desenvolvimento. Você pode ter experiência nesse sentido: de um modo geral, o número de classes de políticas excede 5, o que é mais problemático.
Todas as classes de política devem ser expostas ao cliente (o chamador), pois cabe ao cliente usar, para que o cliente saiba quais políticas existem e entender as diferenças entre várias políticas, caso contrário, as consequências são graves. Por exemplo, existe um modelo de estratégia para classificar algoritmos que fornecem três algoritmos: classificação rápida, classificação de bolhas e classificação selecionada. Antes que o cliente use esses algoritmos, eles devem entender a aplicação desses três algoritmos? Por exemplo, o cliente precisa usar um contêiner, que é implementado por listas e matrizes vinculados. O cliente também precisa entender a diferença entre listas e matrizes vinculados? Nesse sentido, é contrário à lei dimitiana.
Cenários aplicáveis
Ao fazer o design orientado a objetos, você deve estar muito familiarizado com o padrão de política, porque é essencialmente herança e polimorfismo em objetos orientados a objetos. Depois de ler o código geral do padrão de política, acho que, mesmo que nunca tenha ouvido falar do padrão de política antes, devo tê -lo usado durante o processo de desenvolvimento, certo? Pelo menos nas duas situações a seguir, você pode considerar o uso do modelo de estratégia.
A lógica principal de várias classes é a mesma, e há apenas pequenas diferenças no algoritmo e no comportamento da lógica parcial.
Existem vários comportamentos semelhantes, ou algoritmos, e o cliente precisa decidir dinamicamente qual deles usar, para que você possa usar o padrão de política para encapsular esses algoritmos para o cliente ligar.
O modelo de estratégia é um modelo simples e comumente usado. Quando estamos desenvolvendo, geralmente o usamos intencionalmente ou não intencionalmente. De um modo geral, o modelo de estratégia não será usado sozinho e é mais comum usá -lo de maneira mista com o modo de método de modelo, modo de fábrica etc.