Padrão de Comando para desfazer / refazer no aplicativo de pintura

Eu gostaria de implementar desfazer / refazer em um pequenoaplicação de pintura. Parece que oPadrão de comando adapta-se bem ao uso, mas não tenho certeza de como melhor implementá-lo.

Pelo que entendi o padrão, é necessário incluir em cada comando:

Os detalhes da operação de pintura para fins de refazer (por exemplo, Linha -> pontos iniciais e finais, linha de forma livre ->GeneralPath)O estado do componente antes da alteração para desfazer. Nesse caso, isso será uma pequena imagem instantânea da área afetada pelo comando.

Meu entendimento baseado nisso é que cada comando precisa ser 'atômico' ou autônomo, com todas as informações necessárias para desfazer / refazer essa operação.

Infelizmente, isso exigiria armazenar mais informações do que eu previ. Para uma linha, devemos também explicar coisas comoColor, Stroke eRenderingHints usado para desenhar inicialmente. Isso transforma meus "pequenos comandos simples" em algo ... mais volumoso na memória e com mais código de placa de caldeira para produzir (cada um será um bean serializável1).

Por razões de conservação de memória (principalmente) eu estava querendo 'enganar' na especificação dos comandos. Talvez faça um backup de toda a área de desenho a cada 100ª atualização, mas caso contrário, não armazene nenhuma parte da imagem alterada e simplesmente reconstrua os últimos (até) 100 comandos para cada nova operação de pintura. Mas isso parece problemático para garantir que o estado doGraphics objeto está certo antes de pintar cada parte - esta parte pode exigir uma linha, mas oRenderingHints foram alterados 4 comandos atrás, oColor foi alterado 98 comandos atrás, enquanto oStroke permaneceu o mesmo nos últimos 227 comandos.

Buscar um comando mais eficiente de memória parece lançar o padrão pela janela em termos de ser "atômico". Isso, por sua vez, leva a dificuldades na determinação do comando mais antigo que pode afetar a renderização.

Eu devo:

Procure um novo padrão?Tentativa de implementar minhas necessidades peculiares ajustando o padrão?Jogue tudo isso na lixeira como otimização prematura e codifique-a da forma mais simples (e mais consumidora de memória) que adere ao padrão de comando conforme definido?Atualizar"cada um será um bean serializável" Em segundo pensamento, não. Eu fiz dome cheques para descobrir que umGraphics2D (que encapsula vários parâmetros usados ​​ao desenhar) não é serializável. Além disso, umBasicStroke é serializável, mas a espessura do traço não é armazenada. Eu poderia criar versões serializáveis ​​de muitos dos atributos, mas parece fazer muito mais código, então vou abandonar essa especificação. também. Vou apenas tentar armazenar uma referência a umBufferedImage em tempo de execução.

questionAnswers(2)

yourAnswerToTheQuestion