Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions chain of Responsibility
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
PROJETO DE PADRÃO CHAIN OF RESPONSIBILITY

// A interface do handler declara um método para executar um
// pedido.
interface ComponentWithContextualHelp is
method showHelp()


// A classe base para componentes simples.
abstract class Component implements ComponentWithContextualHelp is
field tooltipText: string

// O contêiner do componente age como o próximo elo na
// corrente de handlers.
protected field container: Container

// O componente mostra um tooltip (dica de contexto) se há
// algum texto de ajuda assinalado a ele. Do contrário ele
// passa a chamada adiante ao contêiner, se ele existir.
method showHelp() is
if (tooltipText != null)
// Mostrar dica de contexto.
else
container.showHelp()


// Contêineres podem conter tanto componentes simples como
// outros contêineres como filhos. As relações da corrente são
// definidas aqui. A classe herda o comportamento showHelp de
// sua mãe.
abstract class Container extends Component is
protected field children: array of Component

method add(child) is
children.add(child)
child.container = this


// Componentes primitivos estão de bom tamanho com a
// implementação de ajuda padrão.
class Button extends Component is
// ...

// Mas componentes complexos podem sobrescrever a implementação
// padrão. Se o texto de ajuda não pode ser fornecido de uma
// nova maneira, o componente pode sempre chamar a implementação
// base (veja a classe Component).
class Panel extends Container is
field modalHelpText: string

method showHelp() is
if (modalHelpText != null)
// Mostra uma janela modal com texto de ajuda.
else
super.showHelp()

// ...o mesmo que acima...
class Dialog extends Container is
field wikiPageURL: string

method showHelp() is
if (wikiPageURL != null)
// Abre a página de ajuda do wiki.
else
super.showHelp()


// Código cliente.
class Application is
// Cada aplicação configura a corrente de forma diferente.
method createUI() is
dialog = new Dialog("Budget Reports")
dialog.wikiPageURL = "http://..."
panel = new Panel(0, 0, 400, 800)
panel.modalHelpText = "This panel does..."
ok = new Button(250, 760, 50, 20, "OK")
ok.tooltipText = "This is an OK button that..."
cancel = new Button(320, 760, 50, 20, "Cancel")
// ...
panel.add(ok)
panel.add(cancel)
dialog.add(panel)

// Imagine o que acontece aqui.
method onF1KeyPress() is
component = this.getComponentAtMouseCoords()
component.showHelp()