สมมติว่าคุณต้องการเขียนอัลกอริทึมเพื่อคำนวณXday ที่ nของเดือนและปีที่กำหนดเช่นวันจันทร์ที่สองของเดือนตุลาคม 2014 คุณต้องการใช้คลาส Time ของ Android android.text.format.Time
เพื่อแสดงวันที่ แต่คุณต้องการเขียนอัลกอริทึมทั่วไปด้วย java.util.Calendar
ที่ยังสามารถนำไปใช้กับ
นี่คือสิ่งที่ฉันทำ
ใน DatetimeMath.java:
public interface DatetimeMath {
public Object createDatetime(int year, int month, int day);
public int getDayOfWeek(Object datetime);
public void increment(Object datetime);
}
ใน 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);
}
}
ใน OrdinalDayOfWeekCalculator.java คลาสที่มีอัลกอริทึมทั่วไป:
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;
}
}
ในแอป Android ของฉันฉันจะเรียกสิ่งที่ต้องการ
OrdinalDayOfWeekCalculator odowc =
new OrdinalDayOfWeekCalculator(new TimeMath());
Time canadianThanksgiving = (Time)odowc.getDate(
year, Calendar.OCTOBER, Time.MONDAY, 2);
ถ้าฉันต้องการใช้อัลกอริทึมเดียวกันซ้ำjava.util.Calendar
ฉันจะเขียนคลาส CalendarMath ที่ใช้สามวิธีใน DatetimeMath จากนั้นใช้
OrdinalDayOfWeekCalculator odowc2 =
new OrdinalDayOfWeekCalculator(new CalendarMath());
Calendar canadianThanksgivingCal = (Calendar)odowc2.getDate(
year, Calendar.OCTOBER, Calendar.MONDAY, 2);