Padrões Para Atribuir Responsabilidades

    projbaixo.gif (9424 bytes)

Introdução

Responsabilidades

Diagramas de interação evidenciam responsabilidades

18-1.gif (2912 bytes)

Padrões

Elementos essenciais de um Design Pattern

Um Nome

O Problema

A Solução

As Consequências

Os padrões GRASP deste capítulo

Expert

Problema

Solução

Exemplo

18-3.gif (2744 bytes)

18-4.gif (2043 bytes)

18-5.gif (3851 bytes)

18-6.gif (5586 bytes)

Discussão

Consequências

Também conhecido como

Creator

Problema

Solução

Exemplo

18-3.gif (2744 bytes)

18-8.gif (2918 bytes)

Discussão

Consequências

Low Coupling

Problema

Solução

Exemplo

18-8a.gif (1358 bytes)

18-9.gif (2161 bytes)

18-10.gif (2350 bytes)

Discussão

class Servidor {
     public void mensagem(MeuTipo x) {
          // código aqui
          x.façaAlgo(Object dados); // dados e x estão acoplados
                                    // (se interface de dados mudar x terá que mudar)
          // mais código
     }
}
class Aluno {
     String nome;
     long   matrícula;
     
     public String getNome() { return nome; }
     public long   getMatrícula() { return matrícula; }

     // etc.
}

ListaOrdenada listaDeAlunos = new ListaOrdenada();
Aluno novoAluno = new Aluno(...);
//etc.
listaDeAlunos.add(novoAluno);
class ListaOrdenada {
     Object[] elementosOrdenados = new Object[tamanhoAdequado];

     public void add(Aluno x) {
          // código não mostrado
          long matrícula1 = x.getMatrícula();
          long matrícula2 = elementosOrdenados[k].getMatrícula();
          if(matrícula1 < matrícula2) {
               // faça algo
          } else {
               // faça outra coisa
          }
     }
class ListaOrdenada {
     Object[] elementosOrdenados = new Object[tamanhoAdequado];

     public void add(Aluno x) {
          // código não mostrado
          if(x.lessThan(elementosOrdenados[K])) {
               // faça algo
          } else {
               // faça outra coisa
          }
     }
Interface Comparable {
     public boolean lessThan(Object outro);
     public boolean greaterThan(Object outro); 
     public boolean equal(Object outro); 
}

class Aluno implements Comparable {
     public boolean lessThan(Object outro) {
          // compare registro de aluno com outro
     }
}

class ListaOrdenada {
     Object[] elementosOrdenados = new Object[tamanhoAdequado];

     public void add(Comparable x) {
          // código não mostrado
          if(x.lessThan(elementosOrdenados[K])) {
               // faça algo
          } else {
               // faça outra coisa
          }
     }
class Lampada {
     public static final ON = 0;

     public void setLampada(int valor) {
          if(valor == ON) {
               // liga lampada
          } else if(valor == 1) {
               // desliga lampada
          } else if(valor == 2) {
               // pisca
          }
     }
}

Lampada lampapa = new Lampada();
lampada.setLampada(Lampada.ON);
lampada.setLampada(2);
class Lampada {
     public void on() { // liga lampada }
     public void off() { // desliga lampada }
     public void pisca() { // pisca }
}

Lampada lampada = new Lampada();
lampada.on();
lampada.pisca();
class Teste {
     public int printFile(File toPrint) {
          if(toPrint está corrompido ) {
               return CORRUPTFLAG;
          }
          // etc. etc.
     }
}

Teste umTeste = new Teste();
int resultado =  umTese.printFile(miniTeste);
if(resultado == CORRUPTFLAG) {
     // oh! oh!
} else if(resultado == -243) {
     // etc. etc.
class Teste {
     public int printFile(File toPrint) throws
                               PrintExeception {
          if(toPrint está corrompido ) {
               throw new PrintExeception();
          }
          // etc. etc.
     }
}

try {
     Teste umTeste = new Teste();
     umTeste.printFile(miniTeste);
} catch(PrintException printError) {
     // faça algo
}

Consequências

High Coesion

Problema

Solução

Exemplo

18-9.gif (2161 bytes)

18-10.gif (2350 bytes)

Discussão

class Angu {
    public static int acharPadrão(String texto, String padrão) {
        // ...
    }
    public static int média(Vector números) {
        // ...
    }
    public static outputStream abreArquivo(string nomeArquivo) {
        // ...
    }
}
class Xpto extends Angu { // quer aproveitar código de Angu
    ...
}
public void faça(int flag) {
    switch(flag) {
    case ON:
        // coisas para tratar de ON
        break;
    case OFF:
        // coisas para tratar de OFF
        break;
    case FECHAR:
        // coisas para tratar de FECHAR
        break;
    case COR:
        // coisas para tratar de COR
        break;
    }
}
procedure inicializaDados() {
    font = "times";
    windowSize = "200,400";
    xpto.nome = "desligado";
    xpto.tamanho = 12;
    xpto.localização = "/usr/local/lib/java";
}
class Xpto {
    public Xpto() {
        this.nome = "desligado";
        this.tamanho = 12;
        this.localização = "/usr/local/lib/java";
    }
}
[Macintosh]
EquationWindow=146,171,406,661
SpacingWindow=0,0,0,0 

[Spacing]
LineSpacing=150%
MatrixRowSpacing=150%
MatrixColSpacing=100%
SuperscriptHeight=45%
SubscriptDepth=25%
LimHeight=25%
LimDepth=100%
LimLineSpacing=100%
NumerHeight=35%
DenomDepth=100%
FractBarOver=1pt
FractBarThick=0.5pt
SubFractBarThick=0.25pt
FenceOver=1pt
SpacingFactor=100%
MinGap=8%
RadicalGap=2pt
EmbellGap=1.5pt
PrimeHeight=45%

[General]
Zoom=200
CustomZoom=150
ShowAll=0
Version=2.01
OptimalPrinter=1
MinRect=0
ForceOpen=0
ToolbarDocked=1
ToolbarShown=1
ToolbarDockPos=1

[Fonts]
Text=Times
Function=Times
Variable=Times,I
LCGreek=Symbol,I
UCGreek=Symbol
Symbol=Symbol
Vector=Times,B
Number=Times 

[Sizes]
Full=12pt
Script=7pt
ScriptScript=5pt
Symbol=18pt
SubSymbol=12pt

Consequências

Controller

Problema

Solução

Exemplo

18-13.gif (1390 bytes)

18-14.gif (2258 bytes)

18-16.gif (3761 bytes)

Discussão

18-17.gif (7597 bytes)

18-18.gif (8856 bytes)

Consequências

Responsabilidades, Role Playing e Cartões CRC

crc.gif (4369 bytes)

proj1-5 programa anterior próxima