capítulo atravessa sete problemas que devem ser abordados adequadamente design Lexi, incluindo quaisquer restrições que devem ser seguidas. Cada problema é analisado em profundidade e são propostas soluções., Cada solução é explicada na íntegra, incluindo pseudo-código e uma versão ligeiramente modificada da técnica de Modelagem de objetos, quando apropriado.finalmente, cada solução está associada diretamente a um ou mais padrões de design. É mostrado como a solução é uma implementação direta desse padrão de design.
Os sete problemas (incluindo suas restrições), e suas soluções (incluindo o padrão(s) referenciada), são as seguintes:
Documento StructureEdit
O documento é “um arranjo básico de elementos gráficos”, tais como caracteres, linhas, formas, etc.,, que “capture the total information content of the document” (pp. 35). A estrutura do documento contém uma coleção desses elementos, e cada elemento pode, por sua vez, ser uma subestrutura de outros elementos.
problemas e restrições
- Texto e gráficos devem ser tratados da mesma forma (isto é, os gráficos não são uma instância derivada do texto, nem vice-versa)
- a implementação deve tratar as estruturas complexas e simples da mesma forma. Não deveria ter que saber a diferença entre os dois.,os derivados específicos de elementos abstratos devem ter elementos analíticos especializados.
solução e padrão
uma composição recursiva é uma estrutura hierárquica de elementos, que constrói “elementos cada vez mais complexos a partir de elementos mais simples” (pp. 36). Cada nó na estrutura conhece seus próprios filhos e seus pais. Se uma operação deve ser realizada em toda a estrutura, cada nó chama a operação em seus filhos (recursivamente).esta é uma implementação do padrão composto, que é uma coleção de nós., O nó é uma classe base abstrata, e derivados podem ser folhas (singular), ou coleções de outros nós (que por sua vez pode conter folhas ou nós de coleta). Quando uma operação é realizada no pai, essa operação é recursivamente passada pela hierarquia.
FormattingEdit
formatação difere da estrutura. Formatação é um método de construção de uma instância particular da estrutura física do documento. Isto inclui quebrar texto em linhas, usando hífens, ajustando para larguras de margem, etc.,
problemas e restrições
- equilíbrio entre (formatação) qualidade, velocidade e espaço de armazenamento
- manter a formatação independente (desengatado) da estrutura do documento.
solução e padrão
uma classe de compositores irá encapsular o algoritmo usado para formatar uma composição. Compositor é uma subclasse do objeto primitivo da estrutura do documento. Um Compositor tem uma instância associada de um objeto de composição., Quando um Compositor executa o seu Compose()
, itera através de cada elemento da sua composição associada, e rearranja a estrutura inserindo objetos de linha e coluna conforme necessário.
O próprio Compositor é uma classe abstrata, permitindo que classes derivadas usem diferentes algoritmos de formatação (tais como espaçamento duplo, margens maiores, etc.)
O Padrão de estratégia é usado para alcançar este objetivo. Uma estratégia é um método de encapsular múltiplos algoritmos a serem usados com base em um contexto em mudança., Neste caso, a formatação deve ser diferente, dependendo se texto, gráficos, elementos simples, etc., estão a ser formatados.
embelezar o InterfaceEdit do utilizador
a capacidade de alterar a interface gráfica que o utilizador usa para interagir com o documento.,
os Problemas e Limitações
- a Demarcação de uma página de texto com uma borda ao redor da área de edição
- barras de Rolagem, que permitem o usuário visualizar diferentes partes da página
- interface de Utilizador objetos não devem saber sobre os enfeites
- Evitar uma “explosão de classes”, que seria causado pela subclassificação para “cada possível combinação de enfeites” e elementos ” (p. 44)
Solução e o Padrão
O uso de um revestimento transparente permite que os elementos que aumentam o comportamento de composição, para ser adicionado a uma composição., Estes elementos, como Border e Scroller, são subclasses especiais do próprio elemento singular. Isso permite que a composição seja aumentada, efetivamente adicionando elementos de Estado. Uma vez que estas melhorias fazem parte da estrutura, seu ID
será chamado quando a estrutura é chamada de id
. Isto significa que o cliente não precisa de nenhum conhecimento especial ou interface com a estrutura para usar os enfeites.,
Este é um padrão decorador, que adiciona responsabilidades a um objeto sem modificar o próprio objeto.
suporte a múltiplos “Look-And-Feel StandardsEdit”
Look-and-feel refere-se a padrões UI específicos da plataforma. Estas normas “definem orientações para a forma como as aplicações aparecem e reagem ao utilizador” (pp. 47).o editor deve implementar padrões de múltiplas plataformas para que seja portátil e facilmente adaptável às novas e emergentes normas
solução e padrão
Uma vez que a criação de objectos concretos diferentes não pode ser feita em execução, o processo de criação de objectos deve ser abstraído., Isto é feito com um guiFactory abstrato, que assume a responsabilidade de criar elementos UI. O guiFactory abstrato tem implementações concretas, tais como MotifFactory, que cria elementos concretos do tipo apropriado (MotifScrollBar). Desta forma, o programa só precisa pedir uma barra de posicionamento e, em tempo de execução, será dado o elemento concreto correto.esta é uma fábrica abstrata. Uma fábrica regular cria objetos de concreto de um tipo. Uma fábrica abstrata cria objetos concretos de diferentes tipos, dependendo da implementação concreta da própria fábrica., Sua capacidade de se concentrar não apenas em objetos concretos, mas em famílias inteiras de objetos concretos “a distingue de outros padrões criacionais, que envolvem apenas um tipo de objeto produto” (pp. 51).
suporte a múltiplos sistemas de janelas Edit
assim como a aparência e a sensação são diferentes entre as plataformas, assim como o método de manipulação de janelas. Cada plataforma exibe, coloca para fora, lida entrada e saída de, e camadas janelas de forma diferente.,
problemas e restrições
- o editor de documentos deve executar em muitos dos “sistemas de janelas importantes e em grande parte incompatíveis” que existem (p. 52)
- uma fábrica abstrata não pode ser usada. Devido a padrões diferentes, não haverá uma classe abstrata comum para cada tipo de widget.
- não criar um novo sistema de janelas não normalizado
solução e padrão
é possível desenvolver “as nossas próprias classes de produtos abstractos e concretos”, porque “todos os sistemas de janelas fazem geralmente a mesma coisa” (p. 52)., Cada sistema de janelas fornece operações para desenhar formas primitivas, iconificação/desconificação, redimensionamento e refrescamento do conteúdo da janela.
uma base abstrata Window
classe pode ser derivada para os diferentes tipos de janelas existentes, como aplicação, iconificado, janela. Estas classes conterão operações que estão associadas com windows, tais como remodelação, graficamente refrescante, etc. Cada janela contém elementos, cujas funções Draw()
são chamadas pelas funções Window
‘s próprias funções draw-related.,
A fim de evitar ter de criar subclasses de janelas específicas para cada plataforma possível, será utilizada uma interface. The Window
class will implement a Window
implementation (WindowImp
) abstract class. Esta classe, por sua vez, será derivada em múltiplas implementações específicas de plataforma, cada uma com operações específicas de plataforma., Assim, apenas um conjunto de Window
classes são necessárias para cada tipo de Window
, e apenas um conjunto de WindowImp
as aulas são necessários para cada plataforma (em vez de o produto Cartesiano de todos os tipos disponíveis e plataformas). Além disso, adicionar um novo tipo de janela não requer qualquer modificação da implementação da plataforma, ou vice-versa.este é um padrão de Ponte. Window
e WindowImp
são diferentes, mas relacionados., Window
lida com windowing no programa, e WindowImp
lida com windowing em uma plataforma. Um deles pode mudar sem nunca ter que modificar o outro. O padrão da ponte permite que estas duas “hierarquias de classe separadas trabalhem juntas, mesmo que evoluam independentemente” (p. 54).
Operationsedit
Todas as acções que o utilizador pode tomar com o documento, desde a introdução de texto, alteração da formatação, saída, gravação, etc.,
os Problemas e Limitações
- Operações devem ser acessados através de diferentes insumos, como uma opção de menu e um atalho de teclado para o mesmo comando
- Cada opção tem uma interface, o que deve ser modificado
- Operações são implementadas em diferentes classes
- a fim de evitar o afastamento, não deve ser um monte de dependências entre implementação e interface de usuário de classes.,
- Desfazer e refazer comandos deve ser suportada na maioria dos documentos operações de alteração, sem limite arbitrário o número de níveis de desfazer
- Funções não são viáveis, desde que não desfazer/refazer facilmente, não são facilmente associadas a um estado, e são difíceis de estender ou reutilização.os Menus devem ser tratados como estruturas hierárquicas compostas. Assim, um menu é um item de menu que contém itens de menu que podem conter outros itens de menu, etc.,
solução e padrão
cada item de menu, em vez de estar instanciado com uma lista de parâmetros, é em vez disso feito com um objeto de comando.
comando é um objeto abstrato que só tem um único abstrato Execute()
método. Objetos derivados estendem o método Execute()
apropriadamente (ou seja, o método utilizaria o buffer da área de transferência do conteúdo). Estes objetos podem ser usados por widgets ou botões tão facilmente quanto podem ser usados por itens de menu.,
Para suporte de desfazer e refazer, Command
também Unexecute()
e Reversible()
. Nas classes derivadas, o primeiro contém o código que irá desfazer esse comando, e o último devolve um valor booleano que define se o comando é inviável. Reversible()
permite que alguns comandos não sejam inviáveis, como um comando de gravação.
Todas as execuções Commands
são mantidas em uma lista com um método de manter um marcador” presente ” diretamente após o comando executado mais recentemente., Um pedido para desfazer irá chamar o Command.Unexecute()
diretamente antes de “presente”, em seguida, mover “presente” de volta um comando. Inversamente, aRedo
request will callCommand.Execute()
after “present”, and move “present” forward one.
This approach is an implementation of the Command pattern. Ele encapsula pedidos em objetos, e usa uma interface comum para acessar esses pedidos. Assim, o cliente pode lidar com pedidos diferentes, e comandos podem ser espalhados por toda a aplicação.,
verificação ortográfica e Hifenationedit
Esta é a capacidade do editor de documentos para analisar textualmente o conteúdo de um documento. Embora haja muitas análises que podem ser realizadas, verificação ortográfica e formatação hifenation são o foco.
os Problemas e Limitações
- Permitir várias formas de verificar a ortografia e a identificar os locais para a hifenização
- Permitir expansão para análise futura (por exemplo, contagem de palavra, de verificação de gramática)
- Ser capaz de iterar através de um texto de conteúdo sem acesso ao texto a estrutura real (e.g.,, array, linked list, string)
- Allow for any manner of traversal of document (beginning to end, end to beginning, alfabetical order, etc.)
solução e padrão
remover o índice inteiro do elemento básico permite a implementação de uma interface de iteração diferente. Isto exigirá métodos extras para a recuperação de objetos e traversal. Estes métodos são colocados em uma interface abstrata
., Cada elemento então implementa uma derivação doIterator
, dependendo de como esse elemento mantém sua lista (ArrayIterator
,LinkListIterator
, etc.).as funções
para a travessia e recuperação são colocadas na interface Iteradora abstrata. Iteradores futuros podem ser derivados com base no tipo de lista que serão iterando através, tais como Arrays ou listas vinculadas. Assim, não importa que tipo de método de indexação qualquer implementação do elemento usa, ele terá o iterador apropriado.esta é uma implementação do padrão iterador., Ele permite ao cliente atravessar através de qualquer coleção de objetos, sem precisar acessar o conteúdo da coleção diretamente, ou se preocupar com o tipo de lista que a estrutura da coleção usa.
Agora que o traversal foi tratado, é possível analisar os elementos de uma estrutura. Não é possível construir cada tipo de análise na própria estrutura do elemento; cada elemento precisaria ser codificado, e grande parte do código seria o mesmo para elementos similares.
em vez disso, um método genérico CheckMe()
é incorporado na classe abstrata do elemento., A cada iterador é dada uma referência a um algoritmo específico (como verificação ortográfica, gramática, etc.). Quando esse iterador passa por sua coleção, ele chama cada elemento de CheckMe
, passando pelo algoritmo especificado. CheckMe
em seguida, passa uma referência ao seu elemento de volta para o referido algoritmo para análise.
assim, para realizar uma verificação ortográfica, um iterador front-to-end seria dado uma referência a um id
objeto., O iterator então teria acesso a cada elemento, executando seu id
método com o parâmetroSpellCheck
. CadaCheckMe
chamaria então oSpellCheck
, passando uma referência ao elemento apropriado.
desta forma, qualquer algoritmo pode ser usado com qualquer método transversal, sem acoplamento de código rígido um com o outro. Por exemplo, Find pode ser usado como “find next” ou “find previous”, dependendo se um iterador “forward” foi usado, ou um iterador “Forward”.,
além disso, os próprios algoritmos podem ser responsáveis por lidar com diferentes elementos. Por exemplo, uma SpellCheck
algoritmo seria ignorar uma Graphic
elemento, ao invés de ter que programar cada Graphic
derivada de elemento para não enviar-se para uma SpellCheck
.