Este artigo descreve um caso de pães tingidos no vapor implementado por Java com base no padrão do decorador. Compartilhe -o para sua referência, como segue:
1. Definição do padrão
O padrão do decorador estende dinamicamente uma função de objeto sem alterar o arquivo original e usar a herança. Ele envolve o objeto real criando um objeto de embalagem, isto é, decoração.
Objetos decorativos e objetos reais têm a mesma interface, para que os objetos do cliente possam interagir com objetos decorativos da mesma maneira que os objetos reais.
Um objeto decorativo contém uma referência a um objeto real.
2. Exemplos do modelo
1. Análise de padrões
Utilizamos o caso de fornecedores de coração negro para fazer pães tingidos para ilustrar esse modelo.
2. Diagrama de classe estática no modo decorador
3. Exemplo de código
3.1 Crie uma interface de pão no vapor - iBread
pacote com.demo.abs;/** * interface de processamento de pão a vapor * * @Author * */interface pública iBread {// Prepare os materiais public void prepair (); // Harmony Public Void KneeFlour (); // pães cozidos no vapor público vazio (); / *** BUNS PROCESSADO A PROCESSO FAIMENTE*/ Public void ();}3.2 Implementação normal de pão - Normalbread
pacote com.demo.abs;/** * Implementação de pães normais no vapor * * @author * */public class Normalbread implementa ibread {// Prepare os ingredientes public void prepair () {System.out.println ("Prepare farinha, água e fermento em pó ..."); } // hemian public void KneeFlour () {System.out.println ("Hmian ..."); } // pães a vapor public vazio a vapor () {System.out.println ("pães cozidos no vapor ... os pães perfumados no forno estão fora do forno!"); } / *** BUNS PROCESSAMENTO A PROCESSO PUBLICO* / Public void () {// Prepare os ingredientes PrePair (); // kneadflour (); // cozido no vapor (); }}3.3 Crie um decorador abstrato - Abstractbread
pacote com.demo.decorator; importar com.demo.abs.ibread;/** * decorador abstrato * * @author * */public abract classe abstractbread implementa ibread {// armazenar objeto iBread, privado de pão final iBread; public abstractbread (pão ireread) {this.bread = pão; } // Prepare o material public void preparar () {this.bread.prepair (); } // gentilmente public void KneeFlour () {this.bread.kneadfLour (); } // pães a vapor public void a vapor () {this.bread.steamed (); } // Processando pães a vapor public void process () {prepair (); joelho (); cozido no vapor (); }}3.4 Crie um decorador de corante - CornDecorator
pacote com.demo.decorator; importar com.demo.abs.ibread;/** * pães de milho dyeed * * @Author * */classe pública CornDecorator estende abstrataBread {// Construct Method public cornCorator (Ibread pão) {super (pão); } // Os vendedores de coração preto começaram a tingir a tinta pública vazia () {System.out.println ("Adicione o corante amarelo de limão ..."); } // Sobrecarregar o método da massa da classe pai @Override public void KneeFlour () {// this.Paint () é iniciado após adicionar corante à farinha; // paste super.kneadflour (); }}3.5 Crie um decorador de SCELYPSE - SweetDecorator
pacote com.demo.decorator; importar com.demo.abs.ibread;/** * pão de Cyperus no vapor * * @author * */public class SweetDecorator estende abstratabread {// método de construção public sweetDecorator (pão ibread) {super (pão); } // Os fornecedores de coração preto começam a adicionar o Cyperus public void Paint () {System.out.println ("Add Cyperus ..."); } // Sobrecarregar o método da massa da classe pai @Override public void KneeFlour () {// Inicie a massa this.paint () depois de adicionar Cyperus à farinha; // hemma super.knEadflour (); }}3.6 Produzindo pães de milho doce - Cliente
pacote com.demo; importar com.demo.abs.ibread; importar com.demo.abs.normalbread; importar com.demo.decorator.corndecorator; import com.demo.decorator.sweetDecorator;/** ** * * * * @author * */public client { // Produção de pães decorativos no vapor System.out.println ("/n ====== Iniciar pães decorativos no vapor !!!"); // Crie uma instância normal de pão cozido no vapor normal // Esta é uma instância do objeto que precisamos embrulhar (decorar) iBread NormBread = new NormBread (); // Vamos começar a decorar os pães normais no vapor! ! ! // Use sacarina para decorar os pães normais de pães no vapor = novo sweetdecorator (Normalbread); // Use corante amarelo de limão para decorar os pães normais de pães no vapor = novo cornDecorator (Normalbread); // Produção de informações sobre pão a vapor NormalBread.process (); System.out.println ("===== decore os pães no vapor final !!!"); }}4. Resultados da operação
==== Comece a decorar pães cozidos no vapor! ! !
Prepare a farinha, a água e o fermento em pó ...
Adicione corante amarelo de limão ...
Adicionar ciane ...
Graxa...
Pães cozidos no vapor ... os pães perfumados no vapor estão fora do forno!
==== O pão decorativo no vapor termina! ! !
3. Os princípios de design deste modelo
1 parte de mudança fechada
2 Princípio "Open and Close"
3 programação abstrata orientada
4. Prefira combinações do que a herança
4. Use ocasiões
1. Quando precisamos adicionar um novo recurso ou responsabilidade a um objeto existente dinamicamente, podemos considerar o uso do padrão do decorador.
2. Quando as responsabilidades de um objeto geralmente mudam ou as responsabilidades precisam aumentar dinamicamente, evite adicionar a expansão da subclasse herdada para se adaptar a essas alterações, porque esse método fará com que a subclasse se expanda muito rapidamente e seja difícil de controlar. Neste momento, o modo decorador pode ser usado.
5. Diagrama de classe estática no modo decorador
Para obter mais informações sobre os algoritmos Java, os leitores interessados neste site podem visualizar os tópicos: "Estrutura de dados Java e tutorial de algoritmo", "Resumo das dicas de nó da operação Java Dom", "Resumo de dicas de operação de Java e Operação de Java" e "Resumo de Java cache" Tips "TIPS"
Espero que este artigo seja útil para a programação Java de todos.