Disons que vous voulez écrire un algorithme pour calculer le nième Xjour d'un mois et d'une année donnés, par exemple, le deuxième lundi d'octobre 2014. Vous souhaitez utiliser la classe Time d'Android android.text.format.Time
pour représenter la date, mais vous voulez également écrire un algorithme générique qui peut également s'appliquer à java.util.Calendar
.
C'est ce que j'ai fait.
Dans DatetimeMath.java :
public interface DatetimeMath {
public Object createDatetime(int year, int month, int day);
public int getDayOfWeek(Object datetime);
public void increment(Object datetime);
}
Dans TimeMath.java :
public class TimeMath implements DatetimeMath {
@Override
public Object createDatetime(int year, int month, int day) {
Time t = new Time();
t.set(day, month, year);
t.normalize(false);
return t;
}
@Override
public int getDayOfWeek(Object o) {
Time t = (Time)o;
return t.weekDay;
}
@Override
public void increment(Object o) {
Time t = (Time)o;
t.set(t.monthDay + 1, t.month, t.year);
t.normalize(false);
}
}
Dans OrdinalDayOfWeekCalculator.java, la classe avec l'algorithme générique :
public class OrdinalDayOfWeekCalculator {
private DatetimeMath datetimeMath;
public OrdinalDayOfWeekCalculator(DatetimeMath m) {
datetimeMath = m;
}
public Object getDate(int year, int month, int dayOfWeek, int ordinal) {
Object datetime = datetimeMath.createDatetime(year, month, 1);
if (datetimeMath.getDayOfWeek(datetime) == dayOfWeek) {
return datetime;
}
int xDayCount = 0;
while (xDayCount != ordinal) {
datetimeMath.increment(datetime);
if (datetimeMath.getDayOfWeek(datetime) == dayOfWeek) {
xDayCount++;
}
}
return datetime;
}
}
Dans mon application Android, j'appellerais quelque chose comme
OrdinalDayOfWeekCalculator odowc =
new OrdinalDayOfWeekCalculator(new TimeMath());
Time canadianThanksgiving = (Time)odowc.getDate(
year, Calendar.OCTOBER, Time.MONDAY, 2);
Si je souhaite réutiliser le même algorithme pour java.util.Calendar
je me contenterais d'écrire une classe CalendarMath qui implémente les trois méthodes de DatetimeMath, puis j'utiliserais la méthode
OrdinalDayOfWeekCalculator odowc2 =
new OrdinalDayOfWeekCalculator(new CalendarMath());
Calendar canadianThanksgivingCal = (Calendar)odowc2.getDate(
year, Calendar.OCTOBER, Calendar.MONDAY, 2);