范例(Examples)
class IntRange {
private int _low, _high;
boolean includes(int arg) {
return arg >= _low && arg <= _high;
}
void grow(int factor) {
_high = _high * factor;
}
IntRange(int low, int high) {
_low = low;
_high = high;
}
為了封裝_low和_high這兩個(gè)值域,我先定義[取值/設(shè)值函數(shù)](如果此前沒有定義的話),并使用它們:
class IntRange {
private int _low, _high;
boolean includes(int arg) {
return arg >= _low && arg <= _high;
}
void grow(int factor) {
_high = _high * factor;
}
int getLow() {
return _low;
}
int getHigh() {
return _high;
}
void setLow(int arg) {
_low = arg;
}
void setHigh(int arg) {
_high = arg;
}
使用本項(xiàng)重構(gòu)時(shí),一般說來,設(shè)值函數(shù)被認(rèn)為應(yīng)該在[對象創(chuàng)建后]才使用,所以初始化過程中的行為有可能與設(shè)值函數(shù)的行為不同。這種情況下,我也許在構(gòu)造函數(shù)中直接訪問值域,要不就是建立另一個(gè)獨(dú)立的初始化函數(shù):
IntRange(int low, int high) {
initialize(low, high);
}
private void initialize(int low, int high) {
_low = low;
_high = high;
}
一旦你擁有一個(gè)subclass,上述所有動(dòng)作的價(jià)值就體現(xiàn)出來了。如下所示:
class CappedRange extends IntRange {
CappedRange(int low, int high, int cap) {
super(low, high);
_cap = cap;
}
private int _cap;
int getCap() {
return _cap;
}
int getHigh() {
return Math.min(super.getHigh(), getCap());
}
}
現(xiàn)在,我可以CappedRange class中覆寫getHigh(),從而加入對cap的考慮,而不必修改IntRange class的任何行為。
class IntRange {
private int _low, _high;
boolean includes(int arg) {
return arg >= _low && arg <= _high;
}
void grow(int factor) {
_high = _high * factor;
}
IntRange(int low, int high) {
_low = low;
_high = high;
}
為了封裝_low和_high這兩個(gè)值域,我先定義[取值/設(shè)值函數(shù)](如果此前沒有定義的話),并使用它們:
class IntRange {
private int _low, _high;
boolean includes(int arg) {
return arg >= _low && arg <= _high;
}
void grow(int factor) {
_high = _high * factor;
}
int getLow() {
return _low;
}
int getHigh() {
return _high;
}
void setLow(int arg) {
_low = arg;
}
void setHigh(int arg) {
_high = arg;
}
使用本項(xiàng)重構(gòu)時(shí),一般說來,設(shè)值函數(shù)被認(rèn)為應(yīng)該在[對象創(chuàng)建后]才使用,所以初始化過程中的行為有可能與設(shè)值函數(shù)的行為不同。這種情況下,我也許在構(gòu)造函數(shù)中直接訪問值域,要不就是建立另一個(gè)獨(dú)立的初始化函數(shù):
IntRange(int low, int high) {
initialize(low, high);
}
private void initialize(int low, int high) {
_low = low;
_high = high;
}
一旦你擁有一個(gè)subclass,上述所有動(dòng)作的價(jià)值就體現(xiàn)出來了。如下所示:
class CappedRange extends IntRange {
CappedRange(int low, int high, int cap) {
super(low, high);
_cap = cap;
}
private int _cap;
int getCap() {
return _cap;
}
int getHigh() {
return Math.min(super.getHigh(), getCap());
}
}
現(xiàn)在,我可以CappedRange class中覆寫getHigh(),從而加入對cap的考慮,而不必修改IntRange class的任何行為。