Composite (padrão de desenho)/Exercício 1: Verificador: Difference between revisions
From Wiki**3
| (5 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
{{TOCright}} | |||
= Problema = | = Problema = | ||
| Line 5: | Line 6: | ||
Exemplo: | Exemplo: | ||
< | <source lang="java"> | ||
String s1 = "batata"; | String s1 = "batata"; | ||
String s2 = "oo"; | String s2 = "oo"; | ||
String s3 = "xyz"; | String s3 = "xyz"; | ||
Validator v = new Or(new And(new LengthGreaterThan(5), | |||
new LengthLesserThan(8)), new LengthEqualTo(2)); | |||
boolean b1 = v.ok(s1); // true | boolean b1 = v.ok(s1); // true | ||
boolean b2 = v.ok(s2); // true | boolean b2 = v.ok(s2); // true | ||
boolean b3 = v.ok(s3); // false | boolean b3 = v.ok(s3); // false | ||
</ | </source> | ||
= Solução = | = Solução = | ||
== Classe Validator == | |||
<source lang="java"> | |||
/** | |||
* Abstract validator class. | |||
*/ | |||
public abstract class Validator { | |||
/** | |||
* @param string | |||
* @return true if the string is valid according to some criterion; false | |||
* otherwise. | |||
*/ | |||
public abstract boolean ok(String string); | |||
} | |||
</source> | |||
== Classe UnaryOperator == | |||
<source lang="java"> | |||
/** | |||
* A simple unary operator. | |||
*/ | |||
public abstract class UnaryOperator extends Validator { | |||
/** | |||
* The argument. | |||
*/ | |||
protected Validator _validator; | |||
/** | |||
* @param validator | |||
*/ | |||
public UnaryOperator(Validator validator) { | |||
_validator = validator; | |||
} | |||
} | |||
</source> | |||
== Classe Not == | |||
<source lang="java"> | |||
/** | |||
* Negation operator. | |||
*/ | |||
public class Not extends UnaryOperator { | |||
/** | |||
* @param validator | |||
*/ | |||
public Not(Validator validator) { | |||
super(validator); | |||
} | |||
/** | |||
* @see Validator#ok(java.lang.String) | |||
*/ | |||
@Override | |||
public boolean ok(String string) { | |||
return !_validator.ok(string); | |||
} | |||
} | |||
</source> | |||
== Classe BinaryOperator == | |||
<source lang="java"> | |||
/** | |||
* A simple binary operator. | |||
*/ | |||
public abstract class BinaryOperator extends Validator { | |||
/** | |||
* The 1st argument. | |||
*/ | |||
protected Validator _first; | |||
/** | |||
* The 2nd argument. | |||
*/ | |||
protected Validator _second; | |||
/** | |||
* @param first | |||
* @param second | |||
*/ | |||
public BinaryOperator(Validator first, Validator second) { | |||
_first = first; | |||
_second = second; | |||
} | |||
} | |||
</source> | |||
== Classe And == | |||
<source lang="java"> | |||
/** | |||
* AND operation. | |||
*/ | |||
public class And extends BinaryOperator { | |||
/** | |||
* @param first | |||
* @param second | |||
*/ | |||
public And(Validator first, Validator second) { | |||
super(first, second); | |||
} | |||
/** | |||
* @see Validator#ok(java.lang.String) | |||
*/ | |||
@Override | |||
public boolean ok(String string) { | |||
return _first.ok(string) && _second.ok(string); | |||
} | |||
} | |||
</source> | |||
== Classe Or == | |||
<source lang="java"> | |||
/** | |||
* AND operation. | |||
*/ | |||
public class Or extends BinaryOperator { | |||
/** | |||
* @param first | |||
* @param second | |||
*/ | |||
public Or(Validator first, Validator second) { | |||
super(first, second); | |||
} | |||
/** | |||
* @see Validator#ok(java.lang.String) | |||
*/ | |||
@Override | |||
public boolean ok(String string) { | |||
return _first.ok(string) || _second.ok(string); | |||
} | |||
} | |||
</source> | |||
== Classe IntegerComparisonOperator == | |||
<source lang="java"> | |||
/** | |||
* Compare some integer value with a reference. | |||
*/ | |||
public abstract class IntegerComparisonOperator extends Validator { | |||
/** | |||
* The reference (an integer). | |||
*/ | |||
protected int _reference; | |||
/** | |||
* @param reference | |||
*/ | |||
public IntegerComparisonOperator(int reference) { | |||
_reference = reference; | |||
} | |||
} | |||
</source> | |||
== Classe LengthGreaterThan == | |||
<source lang="java"> | |||
/** | |||
* Return true if string length is lesser than the reference. | |||
*/ | |||
public class LengthGreaterThan extends IntegerComparisonOperator { | |||
/** | |||
* @param reference | |||
*/ | |||
public LengthGreaterThan(int reference) { | |||
super(reference); | |||
} | |||
/** | |||
* @see Validator#ok(java.lang.String) | |||
*/ | |||
@Override | |||
public boolean ok(String string) { | |||
return string.length() > _reference; | |||
} | |||
} | |||
</source> | |||
== Classe LengthLesserThan == | |||
<source lang="java"> | |||
/** | |||
* Return true if string length is greater than reference. | |||
*/ | |||
public class LengthLesserThan extends IntegerComparisonOperator { | |||
/** | |||
* @param reference | |||
*/ | |||
public LengthLesserThan(int reference) { | |||
super(reference); | |||
} | |||
/** | |||
* @see Validator#ok(java.lang.String) | |||
*/ | |||
@Override | |||
public boolean ok(String string) { | |||
return string.length() < _reference; | |||
} | |||
} | |||
</source> | |||
== Classe LengthEqualTo == | |||
<source lang="java"> | |||
/** | |||
* Return true if string length is equal to the reference. | |||
*/ | |||
public class LengthEqualTo extends IntegerComparisonOperator { | |||
/** | |||
* @param reference | |||
*/ | |||
public LengthEqualTo(int reference) { | |||
super(reference); | |||
} | |||
/** | |||
* @see Validator#ok(java.lang.String) | |||
*/ | |||
@Override | |||
public boolean ok(String string) { | |||
return string.length() == _reference; | |||
} | |||
} | |||
</source> | |||
== Classe LengthIsEven == | |||
<source lang="java"> | |||
/** | |||
* True for non-empty strings. | |||
*/ | |||
public class LengthIsEven extends Validator { | |||
/** | |||
* @see Validator#ok(java.lang.String) | |||
*/ | |||
@Override | |||
public boolean ok(String string) { | |||
return string.length() % 2 != 0; | |||
} | |||
} | |||
</source> | |||
== Classe LengthIsOdd == | |||
<source lang="java"> | |||
/** | |||
* True for non-empty strings. | |||
*/ | |||
public class LengthIsOdd extends Validator { | |||
/** | |||
* @see Validator#ok(java.lang.String) | |||
*/ | |||
@Override | |||
public boolean ok(String string) { | |||
return string.length() % 2 == 0; | |||
} | |||
} | |||
</source> | |||
== Classe NonZeroLength == | |||
<source lang="java"> | |||
/** | |||
* True for non-empty strings. | |||
*/ | |||
public class NonZeroLength extends Validator { | |||
/** | |||
* @see Validator#ok(java.lang.String) | |||
*/ | |||
@Override | |||
public boolean ok(String string) { | |||
return string.length() != 0; | |||
} | |||
} | |||
</source> | |||
== Classe App == | |||
<source lang="java"> | |||
/** | |||
* A simple application. | |||
*/ | |||
public class App { | |||
/** | |||
* @param args | |||
*/ | |||
public static void main(String[] args) { | |||
String s1 = "batata"; | |||
String s2 = "oo"; | |||
String s3 = "xyz"; | |||
Validator v = new Or(new And(new LengthGreaterThan(5), | |||
new LengthLesserThan(8)), new LengthEqualTo(2)); | |||
boolean b1 = v.ok(s1); // true | |||
boolean b2 = v.ok(s2); // true | |||
boolean b3 = v.ok(s3); // false | |||
System.out.println("b1=" + b1 + " b2=" + b2 + " b3=" + b3); | |||
} | |||
} | |||
</source> | |||
= Compilação e Execução = | |||
== Compilação == | |||
== Execução == | |||
java App | |||
Resultado: | |||
b1=true b2=true b3=false | |||
[[category:PO]] | [[category:PO]] | ||
[[category:Ensino]] | [[category:Ensino]] | ||
[[category:PO Exemplos]] | |||
Latest revision as of 23:41, 7 November 2018
Problema
Os elementos de uma colecção de nomes (String) têm um conjunto de propriedades a verificar. Para tal, foi criado um verificador automático que faz uso de avaliadores booleanos representados por objectos. Cada avaliador booleano tem uma função ok que aceita uma String e devolve um valor booleano. Implemente os seguintes predicados e operadores: NonZeroLength, LengthIsEven, LengthIsOdd, LengthGreaterThan, LengthLesserThan, LengthEqualTo, And (operador binário que é verdadeiro quando dois elementos são verdadeiros), Or (operador binário que é falso quando dois elementos são falsos), Not (operador unário que é verdadeiro quando o seu argumento é falso).
Exemplo:
String s1 = "batata";
String s2 = "oo";
String s3 = "xyz";
Validator v = new Or(new And(new LengthGreaterThan(5),
new LengthLesserThan(8)), new LengthEqualTo(2));
boolean b1 = v.ok(s1); // true
boolean b2 = v.ok(s2); // true
boolean b3 = v.ok(s3); // false
Solução
Classe Validator
/**
* Abstract validator class.
*/
public abstract class Validator {
/**
* @param string
* @return true if the string is valid according to some criterion; false
* otherwise.
*/
public abstract boolean ok(String string);
}
Classe UnaryOperator
/**
* A simple unary operator.
*/
public abstract class UnaryOperator extends Validator {
/**
* The argument.
*/
protected Validator _validator;
/**
* @param validator
*/
public UnaryOperator(Validator validator) {
_validator = validator;
}
}
Classe Not
/**
* Negation operator.
*/
public class Not extends UnaryOperator {
/**
* @param validator
*/
public Not(Validator validator) {
super(validator);
}
/**
* @see Validator#ok(java.lang.String)
*/
@Override
public boolean ok(String string) {
return !_validator.ok(string);
}
}
Classe BinaryOperator
/**
* A simple binary operator.
*/
public abstract class BinaryOperator extends Validator {
/**
* The 1st argument.
*/
protected Validator _first;
/**
* The 2nd argument.
*/
protected Validator _second;
/**
* @param first
* @param second
*/
public BinaryOperator(Validator first, Validator second) {
_first = first;
_second = second;
}
}
Classe And
/**
* AND operation.
*/
public class And extends BinaryOperator {
/**
* @param first
* @param second
*/
public And(Validator first, Validator second) {
super(first, second);
}
/**
* @see Validator#ok(java.lang.String)
*/
@Override
public boolean ok(String string) {
return _first.ok(string) && _second.ok(string);
}
}
Classe Or
/**
* AND operation.
*/
public class Or extends BinaryOperator {
/**
* @param first
* @param second
*/
public Or(Validator first, Validator second) {
super(first, second);
}
/**
* @see Validator#ok(java.lang.String)
*/
@Override
public boolean ok(String string) {
return _first.ok(string) || _second.ok(string);
}
}
Classe IntegerComparisonOperator
/**
* Compare some integer value with a reference.
*/
public abstract class IntegerComparisonOperator extends Validator {
/**
* The reference (an integer).
*/
protected int _reference;
/**
* @param reference
*/
public IntegerComparisonOperator(int reference) {
_reference = reference;
}
}
Classe LengthGreaterThan
/**
* Return true if string length is lesser than the reference.
*/
public class LengthGreaterThan extends IntegerComparisonOperator {
/**
* @param reference
*/
public LengthGreaterThan(int reference) {
super(reference);
}
/**
* @see Validator#ok(java.lang.String)
*/
@Override
public boolean ok(String string) {
return string.length() > _reference;
}
}
Classe LengthLesserThan
/**
* Return true if string length is greater than reference.
*/
public class LengthLesserThan extends IntegerComparisonOperator {
/**
* @param reference
*/
public LengthLesserThan(int reference) {
super(reference);
}
/**
* @see Validator#ok(java.lang.String)
*/
@Override
public boolean ok(String string) {
return string.length() < _reference;
}
}
Classe LengthEqualTo
/**
* Return true if string length is equal to the reference.
*/
public class LengthEqualTo extends IntegerComparisonOperator {
/**
* @param reference
*/
public LengthEqualTo(int reference) {
super(reference);
}
/**
* @see Validator#ok(java.lang.String)
*/
@Override
public boolean ok(String string) {
return string.length() == _reference;
}
}
Classe LengthIsEven
/**
* True for non-empty strings.
*/
public class LengthIsEven extends Validator {
/**
* @see Validator#ok(java.lang.String)
*/
@Override
public boolean ok(String string) {
return string.length() % 2 != 0;
}
}
Classe LengthIsOdd
/**
* True for non-empty strings.
*/
public class LengthIsOdd extends Validator {
/**
* @see Validator#ok(java.lang.String)
*/
@Override
public boolean ok(String string) {
return string.length() % 2 == 0;
}
}
Classe NonZeroLength
/**
* True for non-empty strings.
*/
public class NonZeroLength extends Validator {
/**
* @see Validator#ok(java.lang.String)
*/
@Override
public boolean ok(String string) {
return string.length() != 0;
}
}
Classe App
/**
* A simple application.
*/
public class App {
/**
* @param args
*/
public static void main(String[] args) {
String s1 = "batata";
String s2 = "oo";
String s3 = "xyz";
Validator v = new Or(new And(new LengthGreaterThan(5),
new LengthLesserThan(8)), new LengthEqualTo(2));
boolean b1 = v.ok(s1); // true
boolean b2 = v.ok(s2); // true
boolean b3 = v.ok(s3); // false
System.out.println("b1=" + b1 + " b2=" + b2 + " b3=" + b3);
}
}
Compilação e Execução
Compilação
Execução
java App
Resultado:
b1=true b2=true b3=false