1ãjavaæ¯çº¯é¢å对象çè¯è¨ï¼mainé½æ¯åå°ç±»éçï¼ï¼æ以没æåçç模æ¿åè½ã
2ã使ç¨â模æ¿æ¨¡å¼âå¯ä»¥å®ç°ç±»ä¼¼çææï¼è¿ä¹æ¯javaéæ常ç¨ç模å¼ä¹ä¸ã
以ä¸æ¯ä¸ç¯æç¨ï¼
模æ¿æ¹æ³æ¨¡å¼çç»æ
模æ¿æ¹æ³æ¨¡å¼æ¯ææ模å¼ä¸æ为常è§çå 个模å¼ä¹ä¸ï¼æ¯åºäºç»§æ¿ç代ç å¤ç¨çåºæ¬ææ¯ã
模æ¿æ¹æ³æ¨¡å¼éè¦å¼åæ½è±¡ç±»åå ·ä½åç±»ç设计å¸ä¹é´çåä½ãä¸ä¸ªè®¾è®¡å¸è´è´£ç»åºä¸ä¸ªç®æ³çè½®å»å骨æ¶ï¼å¦ä¸äºè®¾è®¡å¸åè´è´£ç»åºè¿ä¸ªç®æ³çå个é»è¾æ¥éª¤ã代表è¿äºå ·ä½é»è¾æ¥éª¤çæ¹æ³ç§°ååºæ¬æ¹æ³(primitive method)ï¼èå°è¿äºåºæ¬æ¹æ³æ±æ»èµ·æ¥çæ¹æ³å«å模æ¿æ¹æ³(template method)ï¼è¿ä¸ªè®¾è®¡æ¨¡å¼çååå°±æ¯ä»æ¤èæ¥ã
模æ¿æ¹æ³æ代表çè¡ä¸ºç§°ä¸ºé¡¶çº§è¡ä¸ºï¼å ¶é»è¾ç§°ä¸ºé¡¶çº§é»è¾ã模æ¿æ¹æ³æ¨¡å¼çéæç»æå¾å¦ä¸æ示ï¼
è¿éæ¶åå°ä¸¤ä¸ªè§è²ï¼
æ½è±¡æ¨¡æ¿(Abstract Template)è§è²æå¦ä¸è´£ä»»ï¼
â ããå®ä¹äºä¸ä¸ªæå¤ä¸ªæ½è±¡æä½ï¼ä»¥ä¾¿è®©åç±»å®ç°ãè¿äºæ½è±¡æä½å«ååºæ¬æä½ï¼å®ä»¬æ¯ä¸ä¸ªé¡¶çº§é»è¾çç»ææ¥éª¤ã
â ããå®ä¹å¹¶å®ç°äºä¸ä¸ªæ¨¡æ¿æ¹æ³ãè¿ä¸ªæ¨¡æ¿æ¹æ³ä¸è¬æ¯ä¸ä¸ªå ·ä½æ¹æ³ï¼å®ç»åºäºä¸ä¸ªé¡¶çº§é»è¾ç骨æ¶ï¼èé»è¾çç»ææ¥éª¤å¨ç¸åºçæ½è±¡æä½ä¸ï¼æ¨è¿å°åç±»å®ç°ã顶级é»è¾ä¹æå¯è½è°ç¨ä¸äºå ·ä½æ¹æ³ã
å ·ä½æ¨¡æ¿(Concrete Template)è§è²åå¦ä¸è´£ä»»ï¼
â ããå®ç°ç¶ç±»æå®ä¹çä¸ä¸ªæå¤ä¸ªæ½è±¡æ¹æ³ï¼å®ä»¬æ¯ä¸ä¸ªé¡¶çº§é»è¾çç»ææ¥éª¤ã
â ããæ¯ä¸ä¸ªæ½è±¡æ¨¡æ¿è§è²é½å¯ä»¥æä»»æå¤ä¸ªå ·ä½æ¨¡æ¿è§è²ä¸ä¹å¯¹åºï¼èæ¯ä¸ä¸ªå ·ä½æ¨¡æ¿è§è²é½å¯ä»¥ç»åºè¿äºæ½è±¡æ¹æ³ï¼ä¹å°±æ¯é¡¶çº§é»è¾çç»ææ¥éª¤ï¼çä¸åå®ç°ï¼ä»è使å¾é¡¶çº§é»è¾çå®ç°åä¸ç¸åã
æºä»£ç
æ½è±¡æ¨¡æ¿è§è²ç±»ï¼abstractMethod()ãhookMethod()çåºæ¬æ¹æ³æ¯é¡¶çº§é»è¾çç»ææ¥éª¤ï¼è¿ä¸ªé¡¶çº§é»è¾ç±templateMethod()æ¹æ³ä»£è¡¨ã
public abstract class AbstractTemplate {å ·ä½æ¨¡æ¿è§è²ç±»ï¼å®ç°äºç¶ç±»æ声æçåºæ¬æ¹æ³ï¼abstractMethod()æ¹æ³æ代表çå°±æ¯å¼ºå¶åç±»å®ç°çå©ä½é»è¾ï¼èhookMethod()æ¹æ³æ¯å¯éæ©å®ç°çé»è¾ï¼ä¸æ¯å¿ é¡»å®ç°çã
public class ConcreteTemplate extends AbstractTemplate{模æ¿æ¨¡å¼çå ³é®æ¯ï¼åç±»å¯ä»¥ç½®æ¢æç¶ç±»çå¯åé¨åï¼ä½æ¯åç±»å´ä¸å¯ä»¥æ¹å模æ¿æ¹æ³æ代表ç顶级é»è¾ã
æ¯å½å®ä¹ä¸ä¸ªæ°çåç±»æ¶ï¼ä¸è¦æç §æ§å¶æµç¨çæè·¯å»æ³ï¼èåºå½æç §â责任âçæè·¯å»æ³ãæ¢è¨ä¹ï¼åºå½èèåªäºæä½æ¯å¿ 须置æ¢æçï¼åªäºæä½æ¯å¯ä»¥ç½®æ¢æçï¼ä»¥ååªäºæä½æ¯ä¸å¯ä»¥ç½®æ¢æçã使ç¨æ¨¡æ¿æ¨¡å¼å¯ä»¥ä½¿è¿äºè´£ä»»åå¾æ¸ æ°ã