Создайте каждый счетчик, чтобы узнать о счетчиках более высокого порядка, так что вам нужно взаимодействовать со счетчиком только в одном месте. Вы можете использовать конструктор с указанным количеством цифр, чтобы создать счетчик высшего порядка с одной меньшей цифрой. Когда вы увеличиваете счетчик, вы можете сравнить его с используемой базой (количество значений на цифру), сбросить на ноль и увеличить счетчик выше. Получение значения также может быть выполнено рекурсивно.
Хорошо делать этот дизайн без исключений. Исключения следует использовать в тех случаях, когда существует исключительное обстоятельство, превышающее то, что обычно ожидается. Например, при сбое чтения файла или если сетевой сокет не подключится. Вы не должны использовать исключения для обычных событий, таких как счетчик бросков.
Метод сброса должен сбрасывать все счетчики на ноль, и это значение по умолчанию, которое они должны иметь при инициализации. Фактически, метод сброса может использовать ту же самую связь, так что когда вы вызываете reset
на счетчике, он сбрасывает его значение до нуля и вызывает reset
на своем более высоком счетчике, если он установлен.
Вы можете использовать этот же дизайн, чтобы абстрагироваться от таких понятий, как конкретные символы, используемые для представления каждого значения. Вы также можете сделать функцию, чтобы получить весь счетчик, заданный в виде строки, рекурсивно, используя абстрактную функцию для символа для каждого значения, чтобы вы могли создавать подклассы так, как вы планировали.
public class Key {
private Key higherKey;
private int base;
private int value;
public Key(int base, int numberOfDigits) {
this.base = base;
if (numberOFDigits > 1)
this.higherKey = new Key(base, numberOfDigits - 1);
this.value = 0;
}
public int getNumericValue() {
int value = this.value;
if (this.higherKey != null)
value += (this.higherKey.getValue() * this.base);
return value;
}
public void increment() {
this.value++;
if (this.value >= this.base) {
this.value++;
if (this.higherKey != null)
this.higherKey.increment();
}
}
}