キーと値でいくつかの統計情報を見つけるのに2つのインターフェイスがあり、もう1つはオブジェクトを訪問してそれを反復するために使用される2つのインターフェイスを持っています。最初のメソッドは次のとおりです。コードをリファクタリングしてジェネリックで機能的なインターフェイスにする
public interface Statistic {
public String getKey();
public Object getValue();
public String getDetails();
}
そして、ここでそれのための実装です:
public class Collector implements Statistic {
private String key;
private int val;
public Collector(String key, int val) {
this.key = key;
this.val = val;
}
public void setValue(int val) {
this.val = val;
}
@Override
public String getKey() {
return key;
}
@Override
public Integer getValue() {
return val;
}
@Override
public String getDetails() {
return null;
}
}
そしてもう一つは、以下があります。
public interface StatisticsCollector<T extends Object, S extends Statistic> {
public String getName();
public void visit(T object);
public Iterator<S> calculatedStatistics();
}
そして、ここではそれのための実装です:
public class CalculateFromObject<K, V> implements StatisticsCollector<Object, Collector> {
EmployeeValidator empValidator = new EmployeeValidator();
StringValidator strValidator = new StringValidator();
@Override
public String getName() {
return null;
}
@Override
public void visit(Object object) {
if (object instanceof String) {
String str = object.toString();
int upperCaseCount = strValidator.upperCaseFreq(str);
strValidator.set.add(new Collector("Upper Case Letters: ", upperCaseCount));
int lowerCaseCount = strValidator.lowerCaseFreq(str);
strValidator.set.add(new Collector("Lower Case Letters: ", lowerCaseCount));
int digitsCount = strValidator.digitFreq(str);
strValidator.set.add(new Collector("Digits Count: ", digitsCount));
int wordCount = strValidator.wordFreq(str);
strValidator.set.add(new Collector("Words Count: ", wordCount));
int nonWordCount = strValidator.nonWordFreq(str);
strValidator.set.add(new Collector("Non Word Count: ", nonWordCount));
} else if (object instanceof Employee) {
Employee emp = (Employee) object;
empValidator.salaryValidator(emp);
empValidator.birthDateValidator(emp);
empValidator.birthPlaceValidator(emp);
empValidator.resignationDateValidator(emp);
empValidator.positionValidator(emp);
}
}
@Override
public Iterator<Collector> calculatedStatistics() {
return empValidator.set.iterator();
}
}
そして、私のパッケージに私は彼らのセッターとゲッターとのfirstName、lastNameの、給与や位置などのいくつかのプロパティを持っている従業員のための豆を持っています。
私は私のxの給料を持っており、1990年に生まれ、これらの検証のために以下のクラスでしたされ、従業員の数を得るようないくつかの検証を行うしたいと思います:
public class EmployeeValidator {
public Set<Collector> set = new HashSet<>();
public void salaryValidator(Employee emp) {
int count = 0;
// each collector consist of a condition (function), key, value (always incremented)
if (emp.getSalary() < 350) {
set.add(new Collector("Employee with salaries less than 350JD: ", ++count));
} else if (emp.getSalary() >= 350 && emp.getSalary() < 600) {
set.add(new Collector("Employee with salaries between 350JD And 600JD: ", ++count));
} else if (emp.getSalary() >= 600 && emp.getSalary() < 1200) {
set.add(new Collector("Employee with salaries between 600JD And 1200JD ", ++count));
} else if (emp.getSalary() >= 1200) {
set.add(new Collector("Employee with salaries more than 1200JD: ", ++count));
}
}
public void birthDateValidator(Employee emp) {
for (Collector stats : set) {
if (("Employees that where born in " + emp.getBirthDate().getYear() + " = ").equals(stats.getKey())) {
count(stats);
return;
}
}
set.add(new Collector("Employees that where born in " + emp.getBirthDate().getYear() + " = ", 1));
}
public void birthPlaceValidator(Employee emp) {
for (Collector stats : set) {
if (("Employees that where born in " + emp.getBirthPlace() + " = ").equals(stats.getKey())) {
count(stats);
return;
}
}
set.add(new Collector("Employees that where born in " + emp.getBirthPlace() + " = ", 1));
}
public void resignationDateValidator(Employee emp) {
for (Collector stats : set) {
if (("Employees that where Resignation in " + emp.getResignationDate().getYear() + " = ").equals(
stats.getKey())) {
count(stats);
return;
}
}
set.add(new Collector("Employees that where Resignation in " + emp.getResignationDate().getYear() + " = ", 1));
}
public void positionValidator(Employee emp) {
for (Collector stats : set) {
if (("Employees that occupy the " + emp.getPosition() + " position = ").equals(stats.getKey())) {
count(stats);
return;
}
}
set.add(new Collector("Employees that occupy the " + emp.getPosition() + " position = ", 1));
}
private void count(Collector stats) {
int counter = stats.getValue() + 1;
stats.setValue(counter);
}
}
をそして、私は別のクラスを持っています文字列の有効性を確認し、文字列の大文字の数、小文字の数などを確認してください。
CalculateFromObjectクラスのvisitメソッドで確認できますが、正常に動作していると私は期待された結果を得ていますが、私のコードは非常に効率的ではないので、私はそれをgeそれはオブジェクトの任意のタイプを受け入れるようにする、私はいくつかの試みを行っているが、私は立ち往生した。
私は条件に合格し、次のようにそれを確認することができます一つの方法を持っている条件と呼ばれる機能インタフェースを記述しようとしてい:
public interface Conditions {
boolean checkCondition(Object obj);
}
だから、誰かが私を変更するための最良の方法は何か提案することができますジェネリックであり、Studentのようなあらゆるタイプのオブジェクトを受け入れ、できるだけクリーンなデザインパターンを適用することによってコードを作成することができますか?
タスクは彼らに –
主なアイデアを実装することであるように私は、インタフェース統計とコレクタを削除傾けるあなたがインターフェイスを悪用しているということです。クラスでそれをリファクタリングし、必要なものを残してください –
これはどういう意味ですか、私はそれを一般的にして、Studentオブジェクトに対して同じように実装するのは簡単ですか? –