Como um exercício de aprendizado (não estou na escola - apenas um rapaz tentando aprender algo novo), estou tentando escrever uma simulação de porta lógica que incorpore atraso de propagação. O usuário também deve poder agrupar portas para criar objetos de nível superior.
Quero aplicar padrões de design ao meu problema, mas estou tendo dificuldades.
Estou lendo o Head First Design Patterns e vejo que o padrão Command é uma boa maneira de simular pulsos elétricos através de um circuito com atraso. Também vejo que o padrão Composite é uma boa maneira de simular unidades aninhadas. Só não sei como misturar os dois.
Em outras palavras, enquanto atravesso meus portões, vejo que o portão 'x' deve disparar. Ele tem um atraso de 15 nanossegundos, então eu crio um comando com um carimbo de data / hora de 15 ns do tempo atual do jogo. Onde está o expedidor? No exemplo do restaurante, com o comando "Order", a garçonete e o cozinheiro enviam o comando e têm a opção de introduzir um atraso. Se eu tenho um portão 'composto', ele também possui seu próprio despachante? Preciso usar um Singleton para gerenciar a fila?
Li o que pude encontrar, mas ainda preciso de um empurrão na direção certa:
fonte
Respostas:
Você pode querer ver um exemplo de Programação no Scala , pois eles têm um simulador que faz o que você está tentando fazer em Java:
http://www.cs.helsinki.fi/u/wikla/OTS/Sisalto/examples/html/ch30.html#sec6
Observando a abordagem deles, você pode descobrir como alterar seu programa para obter o comportamento desejado.
Você mencionou que não pode adicioná-lo facilmente, então por que não explicar qual é a sua abordagem e qual é a dificuldade que você encontra, para que as pessoas possam lhe dar algumas sugestões que você pode não ter considerado.
Como mencionado, os padrões de design são maneiras de falar sobre o que seu código está fazendo, como uma abreviação, mas a idéia de tentar forçar os padrões de design parece uma má ideia.
Basicamente, um atraso de propagação não deve ser difícil.
Você pode ter uma classe base que é
Gate
, e nela colocar um atraso.Todos os portões se estendem disso e definem o atraso real.
Agora, quando você está seguindo um sinal, quando em um portão, esse encadeamento pode dormir pelo atraso simulado, mas isso também significa que você precisa mapear o tempo real para o tempo simulado, pois o simulador será mais lento que um sistema real seria.
Se você achar que tem muitos threads, basta colocar em uma lista classificada, a seguir no topo, e quando você parar, basta colocar o tempo em que o atraso está concluído e, em cada loop, o simulador selecionará aqueles que estão prontos agora , execute a próxima ação e o próximo atraso acontecerá.
Isso seria semelhante a um loop de jogo.
fonte
Então você não está usando o padrão de comando.
Querido Deus não. O ponto inteiro do padrão composto é que você pode fornecer um objeto composto para um local que espera apenas um objeto. Isso permite que você componha o comportamento de maneira sã.
De jeito nenhum. Você tem apenas uma cozinheira e uma garçonete em todo o mundo? Eles têm apenas uma cozinha?
A mistura do comando e do padrão composto é bastante direta. Você tem alguma interface que representa um comando. Cada comando concreto pode substituir (ou satisfazê-lo em linguagens sem herança) essa interface para fornecer algum comportamento. Seu atraso é um desses comportamentos simples.
O padrão composto fornece dois (ou mais) objetos / comportamentos atrás de uma única interface. O uso mais simples para este exemplo seria um comando composto que usa dois outros comandos e, quando solicitado a executar, aciona os dois comandos armazenados. Dessa forma, você pode usar seu comando 'delay' isolado e qualquer outro comando arbitrário para criar um comando atrasado.
fonte