·ÃÎÊÕßģʽ£¬ÊÇÐÐΪÐÍÉè¼ÆÄ£Ê½Ö®Ò»¡£·ÃÎÊÕßģʽÊÇÒ»ÖÖ½«Êý¾Ý²Ù×÷ÓëÊý¾Ý½á¹¹·ÖÀëµÄÉè¼ÆÄ£Ê½£¬Ëü¿ÉÒÔËãÊÇ
23 ÖÐÉè¼ÆÄ£Ê½ÖÐ×ÔÓµÄÒ»¸ö£¬µ«ËüµÄʹÓÃÆµÂʲ¢²»ÊǺܸߣ¬´ó¶àÊýÇé¿öÏ£¬Äã²¢²»ÐèҪʹÓ÷ÃÎÊÕßģʽ£¬µ«Êǵ±ÄãÒ»µ©ÐèҪʹÓÃËüʱ£¬ÄÇÄã¾ÍÊÇÐèҪʹÓÃËüÁË¡£
·ÃÎÊÕßģʽµÄ»ù±¾Ïë·¨ÊÇ£¬Èí¼þϵͳÖÐÓµÓÐÒ»¸öÓÉÐí¶à¶ÔÏ󹹳ɵġ¢±È½ÏÎȶ¨µÄ¶ÔÏó½á¹¹£¬ÕâЩ¶ÔÏóµÄÀà¶¼ÓµÓÐÒ»¸ö
accept ·½·¨ÓÃÀ´½ÓÊÜ·ÃÎÊÕß¶ÔÏóµÄ·ÃÎÊ¡£·ÃÎÊÕßÊÇÒ»¸ö½Ó¿Ú£¬ËüÓµÓÐÒ»¸ö visit ·½·¨£¬Õâ¸ö·½·¨¶Ô·ÃÎʵ½µÄ¶ÔÏó½á¹¹Öв»Í¬ÀàÐ͵ÄÔªËØ×ö³ö²»Í¬µÄ´¦Àí¡£ÔÚ¶ÔÏó½á¹¹µÄÒ»´Î·ÃÎʹý³ÌÖУ¬ÎÒÃDZéÀúÕû¸ö¶ÔÏó½á¹¹£¬¶Ôÿһ¸öÔªËØ¶¼ÊµÊ©
accept ·½·¨£¬ÔÚÿһ¸öÔªËØµÄ accept ·½·¨Öлáµ÷Ó÷ÃÎÊÕßµÄ visit ·½·¨£¬´Ó¶øÊ¹·ÃÎÊÕßµÃÒÔ´¦Àí¶ÔÏó½á¹¹µÄÿһ¸öÔªËØ£¬ÎÒÃÇ¿ÉÒÔÕë¶Ô¶ÔÏó½á¹¹Éè¼Æ²»Í¬µÄ·ÃÎÊÕßÀàÀ´Íê³É²»Í¬µÄ²Ù×÷£¬´ïµ½Çø±ð¶Ô´ýµÄЧ¹û¡£
¶¨Ò弰ʹÓó¡¾°
¶¨Ò壺·âװһЩ×÷ÓÃÓÚijÖÖÊý¾Ý½á¹¹Öеĸ÷ÔªËØµÄ²Ù×÷£¬Ëü¿ÉÒÔÔÚ²»¸Ä±äÕâ¸öÊý¾Ý½á¹¹µÄǰÌá϶¨Òå×÷ÓÃÓÚÕâÐ©ÔªËØµÄеIJÙ×÷¡£
¿ÉÒÔ¶Ô¶¨ÒåÕâôÀí½â£ºÓÐÕâôһ¸ö²Ù×÷£¬ËüÊÇ×÷ÓÃÓÚÒ»Ð©ÔªËØÖ®Éϵ쬶øÕâÐ©ÔªËØÊôÓÚijһ¸ö¶ÔÏó½á¹¹¡£Í¬Ê±Õâ¸ö²Ù×÷ÊÇÔÚ²»¸Ä±ä¸÷ÔªËØÀàµÄǰÌáÏ£¬ÔÚÕâ¸öǰÌá϶¨ÒåвÙ×÷ÊÇ·ÃÎÊÕßģʽ¾«ËèÖеľ«Ëè¡£
ʹÓó¡¾°£º
£¨1£©¶ÔÏó½á¹¹±È½ÏÎȶ¨£¬µ«¾³£ÐèÒªÔڴ˶ÔÏó½á¹¹É϶¨ÒåеIJÙ×÷¡£
£¨2£©ÐèÒª¶ÔÒ»¸ö¶ÔÏó½á¹¹ÖеĶÔÏó½øÐкܶ಻ͬµÄÇÒ²»Ïà¹ØµÄ²Ù×÷£¬¶øÐèÒª±ÜÃâÕâЩ²Ù×÷¡°ÎÛȾ¡±ÕâЩ¶ÔÏóµÄÀ࣬Ҳ²»Ï£ÍûÔÚÔö¼ÓвÙ×÷ʱÐÞ¸ÄÕâЩÀà¡£
UMLͼ

£¨1£©Visitor£º½Ó¿Ú»òÕß³éÏóÀ࣬Ëü¶¨ÒåÁ˶Ôÿһ¸öÔªËØ£¨Element£©·ÃÎʵÄÐÐΪ£¬ËüµÄ²ÎÊý¾ÍÊÇ¿ÉÒÔ·ÃÎʵÄÔªËØ£¬ËüµÄ·½·¨ÊýÀíÂÛÉÏÀ´½²ÓëÔªËØ¸öÊýÊÇÒ»ÑùµÄ£¬Òò´Ë£¬·ÃÎÊÕßģʽҪÇóÔªËØµÄÀà×åÒªÎȶ¨£¬Èç¹û¾³£Ìí¼Ó¡¢ÒƳýÔªËØÀ࣬±ØÈ»»áµ¼ÖÂÆµ·±µØÐÞ¸ÄVisitor½Ó¿Ú£¬Èç¹ûÕâÑùÔò²»ÊʺÏʹÓ÷ÃÎÊÕßģʽ¡£
£¨2£©ConcreteVisitor1¡¢ConcreteVisitor2£º¾ßÌåµÄ·ÃÎÊÀ࣬ËüÐèÒª¸ø³ö¶Ôÿһ¸öÔªËØÀà·ÃÎÊʱËù²úÉúµÄ¾ßÌåÐÐΪ¡£
£¨3£©Element£ºÔªËؽӿڻòÕß³éÏóÀ࣬Ëü¶¨ÒåÁËÒ»¸ö½ÓÊÜ·ÃÎÊÕߵķ½·¨£¨Accept£©£¬ÆäÒâÒåÊÇָÿһ¸öÔªËØ¶¼Òª¿ÉÒÔ±»·ÃÎÊÕß·ÃÎÊ¡£
£¨4£©ConcreteElementA¡¢ConcreteElementB£º¾ßÌåµÄÔªËØÀ࣬ËüÌṩ½ÓÊÜ·ÃÎÊ·½·¨µÄ¾ßÌåʵÏÖ£¬¶øÕâ¸ö¾ßÌåµÄʵÏÖ£¬Í¨³£Çé¿öÏÂÊÇʹÓ÷ÃÎÊÕßÌṩµÄ·ÃÎʸÃÔªËØÀàµÄ·½·¨¡£
£¨5£©ObjectStructure£º¶¨Òåµ±ÖÐËù˵µÄ¶ÔÏó½á¹¹£¬¶ÔÏó½á¹¹ÊÇÒ»¸ö³éÏó±íÊö£¬ËüÄÚ²¿¹ÜÀíÁËÔªËØ¼¯ºÏ£¬²¢ÇÒ¿ÉÒÔµü´úÕâÐ©ÔªËØ¹©·ÃÎÊÕß·ÃÎÊ¡£
·ÃÎÊÕßģʽµÄ¼òµ¥Àý×Ó
ÎÒÃǶ¼ÖªµÀ²ÆÎñ¶¼ÊÇÓÐÕ˱¾µÄ£¬Õâ¸öÕ˱¾¾Í¿ÉÒÔ×÷Ϊһ¸ö¶ÔÏó½á¹¹£¬¶øËüÆäÖеÄÔªËØÓÐÁ½ÖÖ£¬ÊÕÈëºÍÖ§³ö£¬ÕâÂú×ãÎÒÃÇ·ÃÎÊÕßģʽµÄÒªÇ󣬼´ÔªËصĸöÊýÊÇÎȶ¨µÄ£¬ÒòΪÕ˱¾ÖеÄÔªËØÖ»ÄÜÊÇÊÕÈëºÍÖ§³ö¡£
¶ø²é¿´Õ˱¾µÄÈË¿ÉÄÜÓÐÕâÑù¼¸ÖÖ£¬±ÈÈçÀϰ壬»á¼ÆÊÂÎñËùµÄ×¢»á£¬²ÆÎñÖ÷¹Ü£¬µÈµÈ¡£¶øÕâЩÈËÔÚ¿´Õ˱¾µÄʱºòÏÔȻĿµÄºÍÐÐΪÊDz»Í¬µÄ¡£
Ê×ÏÈÎÒÃǸø³öµ¥×ӵĽӿڣ¬ËüÖ»ÓÐÒ»¸ö·½·¨accept¡£
//µ¥¸öµ¥×ӵĽӿڣ¨Ï൱ÓÚElement£© public interface Bill {
void accept(AccountBookViewer viewer);
} |
ÆäÖеķ½·¨²ÎÊýAccountBookViewerÊÇÒ»¸öÕ˱¾·ÃÎÊÕß½Ó¿Ú£¬½ÓÏÂÀ´Ò²¾ÍÊÇʵÏÖÀ࣬ÊÕÈëµ¥×ÓºÍÏû·Ñµ¥×Ó£¬»òÕß˵ÊÕÈëºÍÖ§³öÀà¡£
//Ïû·ÑµÄµ¥×Ó public class ConsumeBill implements Bill{
private double amount;
private String item;
public ConsumeBill(double amount, String item)
{
super();
this.amount = amount;
this.item = item;
}
public void accept(AccountBookViewer viewer)
{
viewer.view(this);
}
public double getAmount() {
return amount;
}
public String getItem() {
return item;
}
} |
//ÊÕÈëµ¥×Ó public class IncomeBill implements Bill{
private double amount;
private String item;
public IncomeBill(double amount, String item)
{
super();
this.amount = amount;
this.item = item;
}
public void accept(AccountBookViewer viewer)
{
viewer.view(this);
}
public double getAmount() {
return amount;
}
public String getItem() {
return item;
}
} |
ÉÏÃæ×î¹Ø¼üµÄ»¹ÊÇÀïÃæµÄaccept·½·¨£¬ËüÖ±½ÓÈ÷ÃÎÊÕß·ÃÎÊ×Ô¼º£¬ÕâÏ൱ÓÚÒ»´Î¾²Ì¬·ÖÅÉ£¨ÎÄÕÂ×îºó½øÐнâÊÍ£©£¬µ±È»ÎÒÃÇÒ²¿ÉÒÔ²»Ê¹ÓÃÖØÔØ¶øÖ±½Ó¸ø·½·¨²»Í¬µÄÃû³Æ¡£
½ÓÏÂÀ´ÊÇÕ˱¾·ÃÎÊÕß½Ó¿Ú
//Õ˵¥²é¿´Õß½Ó¿Ú£¨Ï൱ÓÚVisitor£© public interface AccountBookViewer {
//²é¿´Ïû·ÑµÄµ¥×Ó
void view(ConsumeBill bill);
//²é¿´ÊÕÈëµÄµ¥×Ó
void view(IncomeBill bill);
} |
ÕâÁ½¸ö·½·¨ÊÇÖØÔØ·½·¨£¬¾ÍÊÇÔÚÉÏÃæµÄÔªËØÀ൱ÖÐÓõ½µÄ£¬µ±È»ÄãÒ²¿ÉÒÔ°´ÕÕ·ÃÎÊÕßģʽÀàͼµ±Öеķ½Ê½È¥×ö£¬½«Á½¸ö·½·¨·Ö±ðÃüÃûΪviewConsumeBillºÍviewIncomeBill£¬¶øÒ»°ã½¨Òé°´ÕÕÀàͼÉÏÀ´×öµÄ
·ÃÎÊÕßµÄʵÏÖ
//ÀϰåÀ࣬²é¿´Õ˱¾µÄÀàÖ®Ò» public class Boss implements AccountBookViewer{
private double totalIncome;
private double totalConsume;
//ÀϰåÖ»¹Ø×¢Ò»¹²»¨Á˶àÉÙÇ®ÒÔ¼°Ò»¹²ÊÕÈë¶àÉÙÇ®£¬ÆäÓಢ²»¹ØÐÄ
public void view(ConsumeBill bill) {
totalConsume += bill.getAmount();
}
public void view(IncomeBill bill) {
totalIncome += bill.getAmount();
}
public double getTotalIncome() {
System.out.println("Àϰå²é¿´Ò»¹²ÊÕÈë¶àÉÙ£¬ÊýÄ¿ÊÇ£º"
+ totalIncome);
return totalIncome;
}
public double getTotalConsume() {
System.out.println("Àϰå²é¿´Ò»¹²»¨·Ñ¶àÉÙ£¬ÊýÄ¿ÊÇ£º"
+ totalConsume);
return totalConsume;
}
} |
//×¢²á»á¼ÆÊ¦À࣬²é¿´Õ˱¾µÄÀàÖ®Ò» public class CPA implements AccountBookViewer{
//×¢»áÔÚ¿´Õ˱¾Ê±£¬Èç¹ûÊÇÖ§³ö£¬ÔòÈç¹ûÖ§³öÊǹ¤×Ê£¬ÔòÐèÒª¿´Ó¦¸Ã½»µÄ˰½»ÁËû
public void view(ConsumeBill bill) {
if (bill.getItem().equals("¹¤×Ê")) {
System.out.println("×¢»á²é¿´¹¤×ÊÊÇ·ñ½»¸öÈËËùµÃ˰¡£");
}
}
//Èç¹ûÊÇÊÕÈ룬ÔòËùÓеÄÊÕÈë¶¼Òª½»Ë°
public void view(IncomeBill bill) {
System.out.println("×¢»á²é¿´ÊÕÈ뽻˰ÁËû¡£");
}
} |
ÀϰåÖ»¹ØÐÄÊÕÈëºÍÖ§³öµÄ×ܶ¶ø×¢»áÖ»¹Ø×¢¸Ã½»Ë°µÄÊÇ·ñ½»Ë°
½ÓÏÂÀ´ÊÇÕ˱¾À࣬ËüÊǵ±Ç°·ÃÎÊÕßģʽÀý×ÓÖеĶÔÏó½á¹¹
//Õ˱¾ÀࣨÏ൱ÓÚObjectStruture£© public class AccountBook { //µ¥×ÓÁбí private List<Bill> billList = new ArrayList<Bill>(); //Ìí¼Óµ¥×Ó public void addBill(Bill bill){ billList.add(bill); } //¹©Õ˱¾µÄ²é¿´Õ߲鿴Õ˱¾ public void show(AccountBookViewer viewer){ for (Bill bill : billList) { bill.accept(viewer); } } } |
Õ˱¾À൱ÖÐÓÐÒ»¸öÁÐ±í£¬Õâ¸öÁбíÊÇÔªËØ£¨Bill£©µÄ¼¯ºÏ£¬Õâ±ãÊǶÔÏó½á¹¹µÄͨ³£±íʾ£¬ËüÒ»°ã»áÊÇÒ»¶ÑÔªËØµÄ¼¯ºÏ£¬²»¹ýÕâ¸ö¼¯ºÏ²»Ò»¶¨ÊÇÁÐ±í£¬Ò²¿ÉÄÜÊÇÊ÷£¬Á´±íµÈµÈÈκÎÊý¾Ý½á¹¹£¬ÉõÖÁÊÇÈô¸É¸öÊý¾Ý½á¹¹¡£ÆäÖÐshow·½·¨£¬¾ÍÊÇÕ˱¾ÀàµÄ¾«Ë裬Ëü»áö¾Ùÿһ¸öÔªËØ£¬È÷ÃÎÊÕß·ÃÎÊ¡£
²âÊÔ¿Í»§¶Ë
public class Client {
public static void main(String[] args) {
AccountBook accountBook = new AccountBook();
//Ìí¼ÓÁ½ÌõÊÕÈë
accountBook.addBill(new IncomeBill(10000, "ÂôÉÌÆ·"));
accountBook.addBill(new IncomeBill(12000, "Âô¹ã¸æÎ»"));
//Ìí¼ÓÁ½ÌõÖ§³ö
accountBook.addBill(new ConsumeBill(1000, "¹¤×Ê"));
accountBook.addBill(new ConsumeBill(2000, "²ÄÁÏ·Ñ"));
AccountBookViewer boss = new Boss();
AccountBookViewer cpa = new CPA();
//Á½¸ö·ÃÎÊÕß·Ö±ð·ÃÎÊÕ˱¾
accountBook.show(cpa);
accountBook.show(boss);
((Boss) boss).getTotalConsume();
((Boss) boss).getTotalIncome();
}
} |
ÉÏÃæµÄ´úÂëÖУ¬¿ÉÒÔÕâôÀí½â£¬Õ˱¾ÒÔ¼°Õ˱¾ÖеÄÔªËØÊǷdz£Îȶ¨µÄ£¬ÕâЩ¼¸ºõ²»¿ÉÄܸı䣬¶ø×îÈÝÒ׸ıäµÄ¾ÍÊÇ·ÃÎÊÕßÕⲿ·Ö¡£
·ÃÎÊÕßģʽ×î´óµÄÓŵã¾ÍÊÇÔö¼Ó·ÃÎÊÕ߷dz£ÈÝÒ×£¬ÎÒÃÇ´Ó´úÂëÉÏÀ´¿´£¬Èç¹ûÒªÔö¼ÓÒ»¸ö·ÃÎÊÕߣ¬ÄãÖ»ÐèÒª×öÒ»¼þʼ´¿É£¬ÄǾÍÊÇдһ¸öÀ࣬ʵÏÖAccountBookViewer½Ó¿Ú£¬È»ºó¾Í¿ÉÒÔÖ±½Óµ÷ÓÃAccountBookµÄshow·½·¨È¥·ÃÎÊÕ˱¾ÁË¡£
Èç¹ûûʹÓ÷ÃÎÊÕßģʽ£¬Ò»¶¨»áÔö¼ÓÐí¶àif else£¬¶øÇÒÿÔö¼ÓÒ»¸ö·ÃÎÊÕߣ¬Äã¶¼ÐèÒª¸ÄÄãµÄif else£¬´úÂë»áÏԵ÷dz£Ó·Ö×£¬¶øÇҷdz£ÄÑÒÔÀ©Õ¹ºÍά»¤¡£
¾²Ì¬·ÖÅÉÒÔ¼°¶¯Ì¬·ÖÅÉ
±äÁ¿±»ÉùÃ÷ʱµÄÀàÐͽÐ×ö±äÁ¿µÄ¾²Ì¬ÀàÐÍ(Static Type)£¬ÓÐЩÈËÓְѾ²Ì¬ÀàÐͽÐ×öÃ÷ÏÔÀàÐÍ(Apparent
Type)£»¶ø±äÁ¿ËùÒýÓõĶÔÏóµÄÕæÊµÀàÐÍÓÖ½Ð×ö±äÁ¿µÄʵ¼ÊÀàÐÍ(Actual Type)¡£±ÈÈ磺
List list = null; list = new ArrayList(); |
ÉùÃ÷ÁËÒ»¸ö±äÁ¿list£¬ËüµÄ¾²Ì¬ÀàÐÍ£¨Ò²½ÐÃ÷ÏÔÀàÐÍ£©ÊÇList£¬¶øËüµÄʵ¼ÊÀàÐÍÊÇArrayList¡£¸ù¾Ý¶ÔÏóµÄÀàÐͶø¶Ô·½·¨½øÐеÄÑ¡Ôñ£¬¾ÍÊÇ·ÖÅÉ(Dispatch)£¬·ÖÅÉ(Dispatch)ÓÖ·ÖΪÁ½ÖÖ£¬¼´¾²Ì¬·ÖÅɺͶ¯Ì¬·ÖÅÉ¡£¾²Ì¬·ÖÅÉ(Static
Dispatch)·¢ÉúÔÚ±àÒëʱÆÚ£¬·ÖÅɸù¾Ý¾²Ì¬ÀàÐÍÐÅÏ¢·¢Éú¡£
¾²Ì¬·ÖÅÉ
¾²Ì¬·ÖÅɾÍÊǰ´ÕÕ±äÁ¿µÄ¾²Ì¬ÀàÐͽøÐзÖÅÉ£¬´Ó¶øÈ·¶¨·½·¨µÄÖ´Ðа汾£¬¾²Ì¬·ÖÅÉÔÚ±àÒëʱÆÚ¾Í¿ÉÒÔÈ·¶¨·½·¨µÄ°æ±¾¡£¶ø¾²Ì¬·ÖÅÉ×îµäÐ͵ÄÓ¦ÓþÍÊÇ·½·¨
ÖØÔØ
public class Main {
public void test(String string){
System.out.println("string");
}
public void test(Integer integer){
System.out.println("integer");
}
public static void main(String[] args) {
String string = "1";
Integer integer = 1;
Main main = new Main();
main.test(integer);
main.test(string);
}
} |
ÔÚ¾²Ì¬·ÖÅÉÅжϵÄʱºò£¬ÎÒÃǸù¾Ý¶à¸öÅжÏÒÀ¾Ý£¨¼´²ÎÊýÀàÐͺ͸öÊý£©ÅжϳöÁË·½·¨µÄ°æ±¾£¬ÄÇôÕâ¸ö¾ÍÊǶà·ÖÅɵĸÅÄÒòΪÎÒÃÇÓÐÒ»¸öÒÔÉϵĿ¼Á¿±ê×¼£¬Ò²¿ÉÒÔ³ÆÎª×ÚÁ¿¡£ËùÒÔJavaÊǾ²Ì¬¶à·ÖÅɵÄÓïÑÔ¡£
¶¯Ì¬·ÖÅÉ
¶ÔÓÚ¶¯Ì¬·ÖÅÉ£¬Ó뾲̬Ïà·´£¬Ëü²»ÊÇÔÚ±àÒëÆÚÈ·¶¨µÄ·½·¨°æ±¾£¬¶øÊÇÔÚÔËÐÐʱ²ÅÄÜÈ·¶¨¡£¶ø¶¯Ì¬·ÖÅÉ×îµäÐ͵ÄÓ¦ÓþÍÊǶà̬µÄÌØÐÔ
interface Person{ void test(); } class Man implements Person{ public void test(){ System.out.println("ÄÐÈË"); } } class Woman implements Person{ public void test(){ System.out.println("Å®ÈË"); } } public class Main {
public static void main(String[] args) {
Person man = new Man();
Person woman = new Woman();
man.test();
woman.test();
}
} |
Õâ¶Î³ÌÐòÊä³ö½á¹ûΪÒÀ´Î´òÓ¡ÄÐÈ˺ÍÅ®ÈË£¬È»¶øÕâÀïµÄtest·½·¨°æ±¾£¬¾ÍÎÞ·¨¸ù¾ÝmanºÍwomanµÄ¾²Ì¬ÀàÐÍÈ¥ÅжÏÁË£¬ËûÃǵľ²Ì¬ÀàÐͶ¼ÊÇPerson½Ó¿Ú£¬¸ù±¾ÎÞ´ÓÅжϡ£
ÏÔÈ»£¬²úÉúµÄÊä³ö½á¹û£¬¾ÍÊÇÒòΪtest·½·¨µÄ°æ±¾ÊÇÔÚÔËÐÐʱÅжϵģ¬Õâ¾ÍÊǶ¯Ì¬·ÖÅÉ¡£
¶¯Ì¬·ÖÅÉÅжϵķ½·¨ÊÇÔÚÔËÐÐʱ»ñÈ¡µ½manºÍwomanµÄʵ¼ÊÒýÓÃÀàÐÍ£¬ÔÙÈ·¶¨·½·¨µÄ°æ±¾£¬¶øÓÉÓÚ´ËʱÅжϵÄÒÀ¾ÝÖ»ÊÇʵ¼ÊÒýÓÃÀàÐÍ£¬Ö»ÓÐÒ»¸öÅжÏÒÀ¾Ý£¬ËùÒÔÕâ¾ÍÊǵ¥·ÖÅɵĸÅÄÕâʱÎÒÃǵĿ¼Á¿±ê×¼Ö»ÓÐÒ»¸ö×ÚÁ¿£¬¼´±äÁ¿µÄʵ¼ÊÒýÓÃÀàÐÍ¡£ÏàÓ¦µÄ£¬Õâ˵Ã÷JAVAÊǶ¯Ì¬µ¥·ÖÅɵÄÓïÑÔ¡£
·ÃÎÊÕßģʽÖеÄα¶¯Ì¬Ë«·ÖÅÉ
·ÃÎÊÕßģʽÖÐʹÓõÄÊÇα¶¯Ì¬Ë«·ÖÅÉ£¬ËùνµÄ¶¯Ì¬Ë«·ÖÅɾÍÊÇÔÚÔËÐÐʱÒÀ¾ÝÁ½¸öʵ¼ÊÀàÐÍÈ¥ÅжÏÒ»¸ö·½·¨µÄÔËÐÐÐÐΪ£¬¶ø·ÃÎÊÕßģʽʵÏÖµÄÊÖ¶ÎÊǽøÐÐÁËÁ½´Î¶¯Ì¬µ¥·ÖÅÉÀ´´ïµ½Õâ¸öЧ¹û¡£
»Øµ½ÉÏÃæÀý×Óµ±ÖÐÕ˱¾ÀàÖеÄaccept·½·¨
for (Bill bill : billList) { bill.accept(viewer); } |
ÕâÀï¾ÍÊÇÒÀ¾ÝbiilºÍviewerÁ½¸öʵ¼ÊÀàÐ;ö¶¨ÁËview·½·¨µÄ°æ±¾£¬´Ó¶ø¾ö¶¨ÁËaccept·½·¨µÄ¶¯×÷¡£
·ÖÎöaccept·½·¨µÄµ÷Óùý³Ì
1.µ±µ÷ÓÃaccept·½·¨Ê±£¬¸ù¾ÝbillµÄʵ¼ÊÀàÐ;ö¶¨Êǵ÷ÓÃConsumeBill»¹ÊÇIncomeBillµÄaccept·½·¨¡£
2.Õâʱaccept·½·¨µÄ°æ±¾ÒѾȷ¶¨£¬¼ÙÈçÊÇConsumeBill£¬ËüµÄaccept·½·¨Êǵ÷ÓÃÏÂÃæÕâÐдúÂë¡£
public void accept(AccountBookViewer viewer) { viewer.view(this); } |
´ËʱµÄthisÊÇConsumeBillÀàÐÍ£¬ËùÒÔ¶ÔÓ¦ÓÚAccountBookViewer½Ó¿ÚµÄview(ConsumeBill
bill)·½·¨£¬´ËʱÐèÒªÔÙ¸ù¾ÝviewerµÄʵ¼ÊÀàÐÍÈ·¶¨view·½·¨µÄ°æ±¾£¬Èç´ËÒ»À´£¬¾ÍÍê³ÉÁ˶¯Ì¬Ë«·ÖÅɵĹý³Ì¡£
ÒÔÉϵĹý³Ì¾ÍÊÇͨ¹ýÁ½´Î¶¯Ì¬Ë«·ÖÅÉ£¬µÚÒ»´Î¶Ôaccept·½·¨½øÐж¯Ì¬·ÖÅÉ£¬µÚ¶þ´Î¶Ôview£¨ÀàͼÖеÄvisit·½·¨£©·½·¨½øÐж¯Ì¬·ÖÅÉ£¬´Ó¶ø´ïµ½Á˸ù¾ÝÁ½¸öʵ¼ÊÀàÐÍÈ·¶¨Ò»¸ö·½·¨µÄÐÐΪµÄЧ¹û¡£
¶øÔ±¾ÎÒÃǵÄ×ö·¨£¬Í¨³£ÊÇ´«ÈëÒ»¸ö½Ó¿Ú£¬Ö±½ÓʹÓøýӿڵķ½·¨£¬´ËΪ¶¯Ì¬µ¥·ÖÅÉ£¬¾ÍÏñ²ßÂÔģʽһÑù¡£ÔÚÕâÀshow·½·¨´«ÈëµÄviewer½Ó¿Ú²¢²»ÊÇÖ±½Óµ÷ÓÃ×Ô¼ºµÄview·½·¨£¬¶øÊÇͨ¹ýbillµÄʵ¼ÊÀàÐÍÏȶ¯Ì¬·ÖÅÉÒ»´Î£¬È»ºóÔÚ·ÖÅɺóÈ·¶¨µÄ·½·¨°æ±¾ÀïÔÙ½øÐÐ×Ô¼ºµÄ¶¯Ì¬·ÖÅÉ¡£
×¢Ò⣺ÕâÀïÈ·¶¨view(ConsumeBill bill)·½·¨ÊǾ²Ì¬·ÖÅɾö¶¨µÄ£¬ËùÒÔÕâ¸ö²¢²»Ôڴ˴ζ¯Ì¬Ë«·ÖÅɵķ¶³ëÄÚ£¬¶øÇÒ¾²Ì¬·ÖÅÉÊÇÔÚ±àÒëÆÚ¾ÍÍê³ÉµÄ£¬ËùÒÔview(ConsumeBill
bill)·½·¨µÄ¾²Ì¬·ÖÅÉÓë·ÃÎÊÕßģʽµÄ¶¯Ì¬Ë«·ÖÅɲ¢Ã»ÓÐÈκιØÏµ¡£¶¯Ì¬Ë«·ÖÅÉ˵µ½µ×»¹ÊǶ¯Ì¬·ÖÅÉ£¬ÊÇÔÚÔËÐÐʱ·¢ÉúµÄ£¬ËüÓ뾲̬·ÖÅÉÓÐ×ű¾ÖÊÉϵÄÇø±ð£¬²»¿ÉÒÔ˵һ´Î¶¯Ì¬·ÖÅɼÓÒ»´Î¾²Ì¬·ÖÅɾÍÊǶ¯Ì¬Ë«·ÖÅÉ£¬¶øÇÒ·ÃÎÊÕßģʽµÄË«·ÖÅɱ¾ÉíÒ²ÊÇÁíÓÐËùÖ¸¡£
ÕâÀïµÄthisµÄÀàÐͲ»ÊǶ¯Ì¬È·¶¨µÄ£¬ÄãдÔÚÄĸöÀ൱ÖУ¬ËüµÄ¾²Ì¬ÀàÐ;ÍÊÇÄĸöÀ࣬ÕâÊÇÔÚ±àÒëÆÚ¾ÍÈ·¶¨µÄ£¬²»È·¶¨µÄÊÇËüµÄʵ¼ÊÀàÐÍ£¬Çë¸÷Î»Çø·Ö¿ªÕâÒ»µã¡£
¶Ô·ÃÎÊÕßģʽµÄһЩ˼¿¼
¼ÙÉèÎÒÃÇÉÏÃæµÄÀý×Óµ±ÖÐÔÙÌí¼ÓÒ»¸ö²ÆÎñÖ÷¹Ü£¬¶ø²ÆÎñÖ÷¹Ü²»¹ÜÄãÊÇÖ§³ö»¹ÊÇÊÕÈ룬¶¼ÒªÏêϸµÄ²é¿´ÄãµÄµ¥×ÓµÄÏîÄ¿ÒÔ¼°½ð¶î£¬¼òµ¥µã˵¾ÍÊDzÆÎñÖ÷¹ÜÀàµÄÁ½¸öview·½·¨µÄ´úÂëÊÇÒ»ÑùµÄ¡£
ÕâÀïµÄ½«Á½¸öview·½·¨³éÈ¡µÄ·½°¸ÊÇ£¬ÎÒÃÇ¿ÉÒÔ½«ÔªËØÌáÁ¶³ö²ã´Î½á¹¹£¬Õë¶Ô²ã´Î½á¹¹Ìṩ²Ù×÷µÄ·½·¨£¬ÕâÑù¾ÍʵÏÖÁËÓŵ㵱ÖÐ×îºóÁ½µãÌáµ½µÄÕë¶Ô²ã´Î¶¨Òå²Ù×÷ÒÔ¼°¿çÔ½²ã´Î¶¨Òå²Ù×÷¡£
//µ¥¸öµ¥×ӵĽӿڣ¨Ï൱ÓÚElement£© public interface Bill {
void accept(Viewer viewer);
} |
//³éÏóµ¥×ÓÀ࣬һ¸ö¸ß²ã´ÎµÄµ¥×Ó³éÏó public abstract class AbstractBill implements Bill{
protected double amount;
protected String item;
public AbstractBill(double amount, String item)
{
super();
this.amount = amount;
this.item = item;
}
public double getAmount() {
return amount;
}
public String getItem() {
return item;
}
} |
//ÊÕÈëµ¥×Ó public class IncomeBill extends AbstractBill{
public IncomeBill(double amount, String item)
{
super(amount, item);
}
public void accept(Viewer viewer) {
if (viewer instanceof AbstractViewer) {
((AbstractViewer)viewer).viewIncomeBill(this);
return;
}
viewer.viewAbstractBill(this);
}
} |
//Ïû·ÑµÄµ¥×Ó public class ConsumeBill extends AbstractBill{
public ConsumeBill(double amount, String item)
{
super(amount, item);
}
public void accept(Viewer viewer) {
if (viewer instanceof AbstractViewer) {
((AbstractViewer)viewer).viewConsumeBill(this);
return;
}
viewer.viewAbstractBill(this);
}
} |
ÕâÊÇÔªËØÀàµÄ²ã´Î½á¹¹£¬¿ÉÒÔ¿´µ½£¬ÎÒÃǵÄacceptµ±ÖгöÏÖÁËifÅжϣ¬ÕâÀïµÄÅжÏÊÇÔÚÅжÏÒ»¸ö²ã´Î£¬Õâ¶Î´úÂëÊDz»»á±»¸ü¸ÄµÄ¡£
·ÃÎÊÕß²ã´Î
//³¬¼¶·ÃÎÊÕß½Ó¿Ú£¨ËüÖ§³Ö¶¨Òå¸ß²ã²Ù×÷£© public interface Viewer{
void viewAbstractBill(AbstractBill bill);
} |
//±ÈViewer½Ó¿ÚµÍÒ»¸ö²ã´ÎµÄ·ÃÎÊÕß½Ó¿Ú public abstract class AbstractViewer implements Viewer{
//²é¿´Ïû·ÑµÄµ¥×Ó
abstract void viewConsumeBill(ConsumeBill bill);
//²é¿´ÊÕÈëµÄµ¥×Ó
abstract void viewIncomeBill(IncomeBill bill);
public final void viewAbstractBill(AbstractBill
bill){}
} |
//ÀϰåÀ࣬²é¿´Õ˱¾µÄÀàÖ®Ò»£¬×÷ÓÃÓÚ×îµÍ²ã´Î½á¹¹ public class Boss extends AbstractViewer{
private double totalIncome;
private double totalConsume;
//ÀϰåÖ»¹Ø×¢Ò»¹²»¨Á˶àÉÙÇ®ÒÔ¼°Ò»¹²ÊÕÈë¶àÉÙÇ®£¬ÆäÓಢ²»¹ØÐÄ
public void viewConsumeBill(ConsumeBill bill)
{
totalConsume += bill.getAmount();
}
public void viewIncomeBill(IncomeBill bill)
{
totalIncome += bill.getAmount();
}
public double getTotalIncome() {
System.out.println("Àϰå²é¿´Ò»¹²ÊÕÈë¶àÉÙ£¬ÊýÄ¿ÊÇ£º"
+ totalIncome);
return totalIncome;
}
public double getTotalConsume() {
System.out.println("Àϰå²é¿´Ò»¹²»¨·Ñ¶àÉÙ£¬ÊýÄ¿ÊÇ£º"
+ totalConsume);
return totalConsume;
}
} |
//×¢²á»á¼ÆÊ¦À࣬²é¿´Õ˱¾µÄÀàÖ®Ò»£¬×÷ÓÃÓÚ×îµÍ²ã´Î½á¹¹ public class CPA extends AbstractViewer{
//×¢»áÔÚ¿´Õ˱¾Ê±£¬Èç¹ûÊÇÖ§³ö£¬ÔòÈç¹ûÖ§³öÊǹ¤×Ê£¬ÔòÐèÒª¿´Ó¦¸Ã½»µÄ˰½»ÁËû
public void viewConsumeBill(ConsumeBill bill)
{
if (bill.getItem().equals("¹¤×Ê")) {
System.out.println("×¢»á²é¿´ÊÇ·ñ½»¸öÈËËùµÃ˰¡£");
}
}
//Èç¹ûÊÇÊÕÈ룬ÔòËùÓеÄÊÕÈë¶¼Òª½»Ë°
public void viewIncomeBill(IncomeBill bill) {
System.out.println("×¢»á²é¿´ÊÕÈ뽻˰ÁËû¡£");
}
} |
//²ÆÎñÖ÷¹ÜÀ࣬²é¿´Õ˱¾µÄÀàÖ®Ò»£¬×÷ÓÃÓڸ߲ãµÄ²ã´Î½á¹¹ public class CFO implements Viewer {
//²ÆÎñÖ÷¹Ü¶Ôÿһ¸öµ¥×Ó¶¼ÒªºË¶ÔÏîÄ¿ºÍ½ð¶î
public void viewAbstractBill(AbstractBill bill)
{
System.out.println("²ÆÎñÖ÷¹Ü²é¿´Õ˱¾Ê±£¬Ã¿Ò»¸ö¶¼ºË¶ÔÏîÄ¿ºÍ½ð¶î£¬½ð¶îÊÇ"
+ bill.getAmount() + "£¬ÏîÄ¿ÊÇ" + bill.getItem());
}
} |
²ÆÎñÖ÷¹Ü£¨CFO£©ÊÇÕë¶ÔAbstractBillÕâÒ»²ã¶¨ÒåµÄ²Ù×÷£¬¶øÔÀ´µÄÀϰ壨Boss£©ºÍ×¢²á»á¼ÆÊ¦£¨CPA£©¶¼ÊÇÕë¶ÔConsumeBillºÍIncomeBillÕâÒ»²ã¶¨ÒåµÄ²Ù×÷£¬ÕâʱÒѾ²úÉúÁË¿çÔ½²ã´Î½á¹¹µÄÐÐΪ£¬ÀϰåºÍ×¢²á»á¼ÆÊ¦¶¼¿ç¹ýÁ˳éÏóµ¥×ÓÕâÒ»²ã£¬Ö±½ÓÕë¶Ô¾ßÌåµÄµ¥×Ó¶¨Òå²Ù×÷¡£
Õ˱¾ÀàûÓб仯£¬×îºó¿´¿Í»§¶ËµÄʹÓÃ
public class Client {
public static void main(String[] args) {
AccountBook accountBook = new AccountBook();
//Ìí¼ÓÁ½ÌõÊÕÈë
accountBook.addBill(new IncomeBill(10000, "ÂôÉÌÆ·"));
accountBook.addBill(new IncomeBill(12000, "Âô¹ã¸æÎ»"));
//Ìí¼ÓÁ½ÌõÖ§³ö
accountBook.addBill(new ConsumeBill(1000, "¹¤×Ê"));
accountBook.addBill(new ConsumeBill(2000, "²ÄÁÏ·Ñ"));
Viewer boss = new Boss();
Viewer cpa = new CPA();
Viewer cfo = new CFO();
//Á½¸ö·ÃÎÊÕß·Ö±ð·ÃÎÊÕ˱¾
accountBook.show(cpa);
accountBook.show(boss);
accountBook.show(cfo);
((Boss) boss).getTotalConsume();
((Boss) boss).getTotalIncome();
}
} |
»ØÏëһϣ¬ÒªÊÇÔÙ³öÏֺͲÆÎñÖ÷¹ÜÒ»Ñù¶ÔËùÓе¥×Ó¶¼ÊÇÒ»Ñù²Ù×÷µÄÈË£¬ÎÒÃǾͲ»ÐèÒª¸´ÖÆ´úÂëÁË£¬Ö»ÐèÒªÈÃËûʵÏÖViewer½Ó¿Ú¾Í¿ÉÒÔÁË£¬¶øÈç¹ûÒªÏñÀϰåºÍ×¢»áÒ»ÑùÇø·Öµ¥×ӵľßÌåÀàÐÍ£¬Ôò¼Ì³ÐAbstractViewer¾Í¿ÉÒÔ¡£
AndroidÖеķÃÎÊÕßģʽ
°²×¿ÖеÄÖøÃû¿ªÔ´¿âButterKnife¡¢Dagger¡¢Retrofit¶¼ÊÇ»ùÓÚAPT£¨Annotation
Processing Tools£©ÊµÏÖ¡£¶ø±àÒë×¢½âºËÐÄÒÀÀµAPT¡£µ±ÎÒÃÇͨ¹ýAPT´¦Àí×¢½âʱ£¬×îÖջὫ»ñÈ¡µ½µÄÔªËØ×ª»»ÎªÏàÓ¦µÄElementÔªËØ£¬ÒÔ±ã»ñÈ¡µ½ËüÃǶÔÓ¦ÐÅÏ¢¡£ÄÇÃ´ÔªËØ»ùÀàµÄÔ´ÂëÈçÏ£º£¨Â·¾¶£ºjavax.lang.model.element.Element£©
public interface Element extends javax.lang.model.AnnotatedConstruct {
/**
* Returns the {@code kind} of this element.
*
* @return the kind of this element
*/
ElementKind getKind();//»ñÈ¡ÔªËØÀàÐÍ
//´úÂëÊ¡ÂÔ
/**
* Applies a visitor to this element.
*
* @param <R> the return type of the visitor's
methods
* @param <P> the type of the additional
parameter to the visitor's methods
* @param v the visitor operating on this element
* @param p additional parameter to the visitor
* @return a visitor-specified result
*/
<R, P> R accept(ElementVisitor<R, P>
v, P p);//½ÓÊÜ·ÃÎÊÕߵķÃÎÊ
} |
ElementVisitor¾ÍÊÇ·ÃÎÊÕßÀàÐÍ£¬ElementVisitorÔ´ÂëÈçÏ£º
public interface ElementVisitor<R, P> { /** * Visits an element. * @param e the element to visit * @param p a visitor-specified parameter * @return a visitor-specified result */ R visit(Element e, P p);
/**
* A convenience method equivalent to {@code v.visit(e,
null)}.
* @param e the element to visit
* @return a visitor-specified result
*/
R visit(Element e);
/**
* Visits a package element.
* @param e the element to visit
* @param p a visitor-specified parameter
* @return a visitor-specified result
*/
R visitPackage(PackageElement e, P p);
/**
* Visits a type element.
* @param e the element to visit
* @param p a visitor-specified parameter
* @return a visitor-specified result
*/
R visitType(TypeElement e, P p);
/**
* Visits a variable element.
* @param e the element to visit
* @param p a visitor-specified parameter
* @return a visitor-specified result
*/
R visitVariable(VariableElement e, P p);
/**
* Visits an executable element.
* @param e the element to visit
* @param p a visitor-specified parameter
* @return a visitor-specified result
*/
R visitExecutable(ExecutableElement e, P p);
/**
* Visits a type parameter element.
* @param e the element to visit
* @param p a visitor-specified parameter
* @return a visitor-specified result
*/
R visitTypeParameter(TypeParameterElement e, P
p);
/**
* Visits an unknown kind of element.
* This can occur if the language evolves and new
kinds
* of elements are added to the {@code Element}
hierarchy.
*
* @param e the element to visit
* @param p a visitor-specified parameter
* @return a visitor-specified result
* @throws UnknownElementException
* a visitor implementation may optionally throw
this exception
*/
R visitUnknown(Element e, P p);
} |
ÔÚElementVisitorÖж¨ÒåÁ˶àÖÖvisit½Ó¿Ú£¬Ã¿¸ö½Ó¿Ú´¦ÀíÒ»ÖÖÔªËØÀàÐÍ£¬ÄÇôÕâ¾ÍÊǵäÐ͵ķÃÎÊÕßģʽ¡£
×ܽá
Óŵ㣺
1¡¢Ê¹µÃÊý¾Ý½á¹¹ºÍ×÷ÓÃÓڽṹÉϵIJÙ×÷½âñʹµÃ²Ù×÷¼¯ºÏ¿ÉÒÔ¶ÀÁ¢±ä»¯¡£
2¡¢Ìí¼ÓеIJÙ×÷»òÕß˵·ÃÎÊÕß»á·Ç³£ÈÝÒס£
3¡¢½«¶Ô¸÷¸öÔªËØµÄÒ»×é²Ù×÷¼¯ÖÐÔÚÒ»¸ö·ÃÎÊÕßÀ൱ÖС£
4¡¢Ê¹µÃÀà²ã´Î½á¹¹²»¸Ä±äµÄÇé¿öÏ£¬¿ÉÒÔÕë¶Ô¸÷¸ö²ã´Î×ö³ö²»Í¬µÄ²Ù×÷£¬¶ø²»Ó°ÏìÀà²ã´Î½á¹¹µÄÍêÕûÐÔ¡£
5¡¢¿ÉÒÔ¿çÔ½Àà²ã´Î½á¹¹£¬·ÃÎʲ»Í¬²ã´ÎµÄÔªËØÀ࣬×ö³öÏàÓ¦µÄ²Ù×÷¡£
ȱµã£º
1¡¢Ôö¼ÓеÄÔªËØ»á·Ç³£À§ÄÑ¡£
2¡¢ÊµÏÖÆðÀ´±È½Ï¸´ÔÓ£¬»áÔö¼ÓϵͳµÄ¸´ÔÓÐÔ¡£
3¡¢ÆÆ»µ·â×°£¬Èç¹û½«·ÃÎÊÐÐΪ·ÅÔÚ¸÷¸öÔªËØÖУ¬Ôò¿ÉÒÔ²»±©Â¶ÔªËصÄÄÚ²¿½á¹¹ºÍ״̬£¬µ«Ê¹Ó÷ÃÎÊÕßģʽµÄʱºò£¬ÎªÁËÈ÷ÃÎÊÕßÄÜ»ñÈ¡µ½Ëù¹ØÐĵÄÐÅÏ¢£¬ÔªËØÀ಻µÃ²»±©Â¶³öһЩÄÚ²¿µÄ״̬ºÍ½á¹¹£¬¾ÍÏñÊÕÈëºÍÖ§³öÀà±ØÐëÌṩ·ÃÎʽð¶îºÍµ¥×ÓµÄÏîÄ¿µÄ·½·¨Ò»Ñù¡£
ÊÊÓÃÐÔ£º
1¡¢Êý¾Ý½á¹¹Îȶ¨£¬×÷ÓÃÓÚÊý¾Ý½á¹¹µÄ²Ù×÷¾³£±ä»¯µÄʱºò¡£
2¡¢µ±Ò»¸öÊý¾Ý½á¹¹ÖУ¬Ò»Ð©ÔªËØÀàÐèÒª¸ºÔðÓëÆä²»Ïà¹ØµÄ²Ù×÷µÄʱºò£¬ÎªÁ˽«ÕâЩ²Ù×÷·ÖÀë³öÈ¥£¬ÒÔ¼õÉÙÕâÐ©ÔªËØÀàµÄÖ°Ôðʱ£¬¿ÉÒÔʹÓ÷ÃÎÊÕßģʽ¡£
3¡¢ÓÐʱÔÚ¶ÔÊý¾Ý½á¹¹ÉϵÄÔªËØ½øÐвÙ×÷µÄʱºò£¬Ðè񻂿·Ö¾ßÌåµÄÀàÐÍ£¬ÕâʱʹÓ÷ÃÎÊÕßģʽ¿ÉÒÔÕë¶Ô²»Í¬µÄÀàÐÍ£¬ÔÚ·ÃÎÊÕßÀàÖж¨Ò岻ͬµÄ²Ù×÷£¬´Ó¶øÈ¥³ýµôÀàÐÍÅжϡ£ |