As classes Menu e Command da biblioteca de interação com o utilizador são as classes responsáveis por apresentar e executar as opções que são disponibilizadas ao utilizador da aplicação. Um menu representa um conjunto de opções e cada opção representa uma funcionalidade da aplicação que é disponibilizada ao utilizador.

Menu


A classe Menu tem a seguinte funcionalidade. Primeiro, para criar um menu deve-se utilizar um dos construtores desta classe. O construtor mais usado é o que recebe dois argumento: uma cadeia de caracteres (representa o título do menu) e um vector de instâncias de Command (representa o conjunto de opções disponibilizado pelo menu).  A indicação do parâmetro com o título é facultativa e serve para identificar a janela de interacção em algumas interfaces gráficas. Após ter sido criado o menu, quando se quiser mostrar as opções do menu ao utilizador dever-se-á invocar o método open() sobre o menu. Este método vai ficar em ciclo. Em cada iteração do ciclo apresenta-se o conjunto de opções do menu e pede-se ao utilizador para escolher uma das opções indicadas. Caso a opção escolhida seja válida, então o menu vai executar o comando correspondente à opção indicada . Se a opção for inválida, pede-se ao utilizador para indicar outra opção. Os menus suportam automaticamente uma opção que é a opção de terminar a execução do menu. Assim, sempre que o utilizador escolhe esta opção (a opção Sair e que corresponde à escolha 0), o ciclo do método open() termina e a execução deste método chega ao fim. As classes MainMenu e EditionMenu representam as classes que concretizam, respectivamente, o menu principal e de edição da aplicação de exemplo.

Note-se que não é obrigatório criar uma classe para concretizar o menu. Podíamos também criar uma instância da classe Menu e de seguida invocar o método open() sobre essa instância. No entanto, a abordagem de criar uma classe para concretizar o menu permite-nos organizar melhor o código. Assim, por exemplo, o código de definição do menu de edição da aplicação exemplo está no package que agrupa as opções de edição ex.app.edit e não no package ex.app.main. Se tivessemos seguido a segunda possibilidade, o código de definição do menu estaria no comando responsável por abrir o menu de edição, pelo que este código estaria agora no package ex.app.main.

Command


A classe Command é abstracta e representa uma dada opção da aplicação. Esta classe define o método abstracto protected void execute() que representa a funcionalidade a ser executada por cada comando. O código específico da funcionalidade em causa deve ser concretizado no método protected void execute() da subclasse. Cada opção de um menu é concretizada por uma subclasse de Command, devendo substituir o método execute() com o código necessário para executar a funcionalidade desejada.  A classe Command suporta um determinado conjunto de funcionalidades que normalmente é necessário em todas as subclasse, diminuindo assim o custo de concretização de cada opção. Por exemplo, dado que normalmente a funcionalidade de um comando exige que haja interacção com o utilizador, seja para pedir ou apresentar dados,  a classe Command disponibiliza uma instância de Form e outra de Display, que podem depois ser utilizadas pelo comando para pedir dados ao utilizador ou apresentar dados ao utilizador, respectivamente. Normalmente, cada comando está ainda associado uma entidade (designada como receiver) que é depois utilizada para poder realizar a funcionalidade do comando em causa. Por esta razão, esta associação entre um comando e o seu receiver é mantida na classe Command e cada instância de uma subclasse de Command acede a esta entidade através do atributo _receiver (que está protected) definido na classe Command. Cada comando tem um ainda título. A cadeia de caracteres que o menu utiliza para descrever cada opção do menu é o título do comando correspondente a cada opção.

A concretização mais comum de um comando corresponde a criar uma subclasse de Command que terá dois métodos:
  • O constructor com um argumento, o receiver, que está associado ao comando a criar. Normalmente, o constructor invoca apenas o constructor da super-classe com dois argumentos: o primeiro é o título do comando e o segundo é o receiver. Caso seja necessário pedir dados ao utilizador, então é necessário indicar ao Form associado ao comando que está ser criado quais é que são os vários pedidos de dados que é necessário realizar.
  • Substituição do método protected void execute() throws DialogException. Neste método concretiza-se a funcionalidade que o comando deve oferecer. Normalmente,  acede-se ao objecto receiver (para executar uma determinada operação) e às instâncias de Form e Display que estão associados ao comando em causas para concretizar a interacção com o utilizador pretendida.
É possível ter um submenu, ou seja ter um menu dentro de outro menu. A forma de concretizar isto é ter um comando no menu exterior cuja funcionalidade é criar o sub-menu e depois invocar o método open sobre este sub-menu. A classe ShowEditionMenu mostra a concretização da funcionalidade apresentar o menu de edição da aplicação de exemplo. Dado que esta opção corresponde apenas a abrir o menu de edição, não é necessário utilizar as instâncias de Form e Display associadas a cada instância desta subclasse de Command. Um exemplo que tira partido destas duas instâncias é disponibilizado na secção que descreve as classes Form e Display.