Classes pre-Componentes / Abordagem Pull
Classes pre-Componentes / Abordagem Pull
Documentação gerada a partir do Notebook Jupyter do mesmo exemplo em notebooks/pt/s04components/s01chart/s02pull.ipynb
Componentes GeometricProgresion
e BarChart
trabalhando em conjunto via Pull
Neste exemplo usaremos a abordagem Pull, ou seja, o objeto da classe BarChart
controla todo o processo e solicita os valores para o objeto da classe GeometricProgression
.
GeometricProgression
abordagem Pull
O GeometricProgression
passa a atuar de forma passiva, aguardando que lhe solicitem valores através dos métodos first
e next
.
Três modificações podem ser observadas:
- a informação do número de valores plotados (
n
) passa para oBarChart
que controla o processo; - o
BarChart
passa a ter a referência para oGeometricProgression
que, por sua vez, não tem mais a referência e consequentemente oconnect
; - o método
present
que atuava ativamente gerando a sequência e enviando para o gráfico foi substituído por dois métodos (first
enext
) que atuam passivamente aguardando a solicitação de valor.
Classe GeometricProgression
Gera uma sequência de números que crescem em progressão geométrica.
- Atributos
initial
- valor inicial da sequência;ratio
- taxa de crescimento da progressão;current
- valor corrente (para controle interno).
- Métodos
first
- gera o primeiro valor da sequência e o retorna;next
- gera o próximo valor da sequência (em relação à última solicitação) e o retorna.
public class GeometricProgression {
private int initial,
ratio;
private int current;
public GeometricProgression(int initial, int ratio) {
this.initial = initial;
this.ratio = ratio;
current = initial;
}
public int first() {
current = initial;
return current;
}
public int next() {
current *= ratio;
return current;
}
}
## `BarChart` abordagem Pull
Três modificações podem ser observadas:
1. o método `plot` foi modificado -- em vez de plotar apenas uma barra, ele plota o gráfico inteiro, já que o `BarChart` controla o processo;
2. por causa da modificação (1), o `BarChart` passa a ter a informação de quantos valores serão plotados;
3. o `BarChart` passa a ter o método `connect`, já que ele guarda a referência para o objeto `GeometricProgression` para solicitar os valores.
## `BarChart` Component
Plota um gráfico de barras no console coletando ativamente dados a serem plotados.
* Atributos
* `filled` - define se a plotagem será preenchida;
* `character` - define o caractere da plotagem;
* `n` - quantidade de valores na sequência;
* `sequence` - referência para um objeto da classe `BarChart`.
* Método
* `conect` - conecta dois objetos informando a um deles (`BarChart`) a identidade do outro `GeometricProgression`.
* `plot()` - plota o gráfico inteiro.
```Java
public class BarChart {
private boolean filled;
private char character;
private int n;
private GeometricProgression sequence;
public BarChart(boolean filled, char character, int n) {
this.filled = filled;
this.character = character;
this.n = n;
this.sequence = null;
}
public void connect(GeometricProgression sequence) {
this.sequence = sequence;
}
public void plot() {
if (sequence != null) {
int value = sequence.first();
for (int s = 1; s <= n; s++) {
for (int v = 1; v < value; v++)
System.out.print((filled) ? character : ' ');
System.out.println(character);
value = sequence.next();
}
}
}
}
Criando e Conectando objetos - abordagem Pull
Exemplo que cria um objeto da classe GeometricProgression
outro da classe BarChart
e os conecta através do novo método connect
. Note que há uma inversão em relação a abordagem Pull. Aqui, o BarChart
possui o método connect
e se conecta ao GeometricProgression
de quem ele solicitará os valores.
GeometricProgression gp = new GeometricProgression(1, 2);
BarChart bc = new BarChart(true, '#', 7);
bc.connect(gp);
bc.plot();
#
##
####
########
################
################################
################################################################
Conectando o objeto GeometricProgression
com dois objetos BarChart
- abordagem Pull
Exemplo conectando o mesmo objeto da classe GeometricProgression
com dois objetos da classe BarChart
.
GeometricProgression gp = new GeometricProgression(1, 2);
BarChart bc1 = new BarChart(true, '#', 7);
BarChart bc2 = new BarChart(false, '*', 7);
bc1.connect(gp);
bc1.plot();
bc2.connect(gp);
bc2.plot();
#
##
####
########
################
################################
################################################################
*
*
*
*
*
*
*
Tarefa do Gráfico de Segundo Grau
Função de segundo grau
Escreva uma classe SecondDegree
cujos objetos produzam valores de uma função de segundo grau na abordagem Pull, ou seja, são produzidos sob demanda a partir de solicitação dos métodos first
e next
.
Plotagem de parábola
Escreva um programa que conecte um objeto da classe SecondDegree
a um objeto da classe BarChart
de forma que seja plotada uma parábola na abordagem Pull. Por conta do comportamento da classe BarChart
, a parábola será plotada virada, ou seja eixos X e Y trocados.