±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜ´´½¨ÐÍģʽ¡¢¹¤³§Ä£Ê½¡¢³éÏ󹤳§Ä£Ê½¡¢µ¥Àýģʽ¡¢½¨ÔìÕßģʽ¡¢ÔÐÍģʽµÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×Լܹ¹Ê¦£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£
|
|
Éè¼ÆÄ£Ê½ÊǶԴó¼Òʵ¼Ê¹¤×÷ÖÐдµÄ¸÷ÖÖ´úÂë½øÐи߲ã´Î³éÏóµÄ×ܽᣬÆäÖÐ×î³öÃûµÄµ±Êô
Gang of Four (GoF) µÄ·ÖÀàÁË£¬ËûÃǽ«Éè¼ÆÄ£Ê½·ÖÀàΪ 23 ÖÖ¾µäµÄģʽ£¬¸ù¾ÝÓÃ;ÎÒÃÇÓÖ¿ÉÒÔ·ÖΪÈý´óÀ࣬·Ö±ðΪ´´½¨ÐÍģʽ¡¢½á¹¹ÐÍģʽºÍÐÐΪÐÍģʽ¡£
ÓÐÒ»Ð©ÖØÒªµÄÉè¼ÆÔÔòÔÚ¿ªÆªºÍ´ó¼Ò·ÖÏíÏ£¬ÕâЩÔÔò½«¹áͨȫÎÄ£º
ÃæÏò½Ó¿Ú±à³Ì£¬¶ø²»ÊÇÃæÏòʵÏÖ¡£Õâ¸öºÜÖØÒª£¬Ò²ÊÇÓÅÑŵġ¢¿ÉÀ©Õ¹µÄ´úÂëµÄµÚÒ»²½£¬Õâ¾Í²»ÐèÒª¶à˵Á˰ɡ£
Ö°Ôðµ¥Ò»ÔÔò¡£Ã¿¸öÀà¶¼Ó¦¸ÃÖ»ÓÐÒ»¸öµ¥Ò»µÄ¹¦ÄÜ£¬²¢ÇҸù¦ÄÜÓ¦¸ÃÓÉÕâ¸öÀàÍêÈ«·â×°ÆðÀ´¡£
¶ÔÐ޸Ĺرգ¬¶ÔÀ©Õ¹¿ª·Å¡£¶ÔÐ޸ĹرÕÊÇ˵£¬ÎÒÃÇÐÁÐÁ¿à¿à¼Ó°àд³öÀ´µÄ´úÂ룬¸ÃʵÏֵŦÄܺ͸ÃÐÞ¸´µÄ bug
¶¼Íê³ÉÁË£¬±ðÈ˿ɲ»ÄÜ˵¸Ä¾Í¸Ä£»¶ÔÀ©Õ¹¿ª·Å¾Í±È½ÏºÃÀí½âÁË£¬Ò²¾ÍÊÇ˵ÔÚÎÒÃÇдºÃµÄ´úÂë»ù´¡ÉÏ£¬ºÜÈÝÒ×ʵÏÖÀ©Õ¹¡£
´´½¨ÐÍģʽ±È½Ï¼òµ¥£¬µ«ÊÇ»á±È½ÏûÓÐÒâ˼£¬½á¹¹ÐͺÍÐÐΪÐͱȽÏÓÐÒâ˼¡£
´´½¨ÐÍģʽ
´´½¨ÐÍģʽµÄ×÷ÓþÍÊÇ´´½¨¶ÔÏó£¬Ëµµ½´´½¨Ò»¸ö¶ÔÏó£¬×îÊìϤµÄ¾ÍÊÇ new Ò»¸ö¶ÔÏó£¬È»ºó set Ïà¹ØÊôÐÔ¡£µ«ÊÇ£¬Ôںܶೡ¾°Ï£¬ÎÒÃÇÐèÒª¸ø¿Í»§¶ËÌṩ¸ü¼ÓÓѺõĴ´½¨¶ÔÏóµÄ·½Ê½£¬ÓÈÆäÊÇÄÇÖÖÎÒÃǶ¨ÒåÁËÀ࣬µ«ÊÇÐèÒªÌṩ¸øÆäËû¿ª·¢ÕßÓõÄʱºò¡£
¼òµ¥¹¤³§Ä£Ê½
ºÍÃû×ÖÒ»Ñù¼òµ¥£¬·Ç³£¼òµ¥£¬Ö±½ÓÉÏ´úÂë°É£º
public class
FoodFactory {
public static Food makeFood(String name) {
if (name.equals("noodle")) {
Food noodle = new LanZhouNoodle();
noodle.addSpicy("more");
return noodle;
} else if (name.equals("chicken"))
{
Food chicken = new HuangMenChicken();
chicken.addCondiment("potato");
return chicken;
} else {
return null;
}
}
} |
ÆäÖУ¬LanZhouNoodle ºÍ HuangMenChicken
¶¼¼Ì³Ð×Ô Food¡£
¼òµ¥µØËµ£¬¼òµ¥¹¤³§Ä£Ê½Í¨³£¾ÍÊÇÕâÑù£¬Ò»¸ö¹¤³§Àà XxxFactory£¬ÀïÃæÓÐÒ»¸ö¾²Ì¬·½·¨£¬¸ù¾ÝÎÒÃDz»Í¬µÄ²ÎÊý£¬·µ»Ø²»Í¬µÄÅÉÉú×Ôͬһ¸ö¸¸Àࣨ»òʵÏÖͬһ½Ó¿Ú£©µÄʵÀý¶ÔÏó¡£
ÎÒÃÇÇ¿µ÷Ö°Ôðµ¥Ò»ÔÔò£¬Ò»¸öÀàÖ»ÌṩһÖÖ¹¦ÄÜ£¬FoodFactory µÄ¹¦ÄܾÍÊÇÖ»Òª¸ºÔðÉú²ú¸÷ÖÖ Food¡£
¹¤³§Ä£Ê½
¼òµ¥¹¤³§Ä£Ê½ºÜ¼òµ¥£¬Èç¹ûËüÄÜÂú×ãÎÒÃǵÄÐèÒª£¬ÎÒ¾õµÃ¾Í²»ÒªÕÛÌÚÁË¡£Ö®ËùÒÔÐèÒªÒýÈ빤³§Ä£Ê½£¬ÊÇÒòΪÎÒÃÇÍùÍùÐèҪʹÓÃÁ½¸ö»òÁ½¸öÒÔÉϵŤ³§¡£
public interface
FoodFactory {
Food makeFood(String name);
}
public class ChineseFoodFactory implements FoodFactory
{
@Override
public Food makeFood(String name) {
if (name.equals("A")) {
return new ChineseFoodA();
} else if (name.equals("B")) {
return new ChineseFoodB();
} else {
return null;
}
}
}
public class AmericanFoodFactory implements
FoodFactory {
@Override
public Food makeFood(String name) {
if (name.equals("A")) {
return new AmericanFoodA();
} else if (name.equals("B")) {
return new AmericanFoodB();
} else {
return null;
}
}
} |
ÆäÖУ¬ChineseFoodA¡¢ChineseFoodB¡¢AmericanFoodA¡¢AmericanFoodB
¶¼ÅÉÉú×Ô Food¡£
¿Í»§¶Ëµ÷Óãº
public class APP {
public static void main(String[] args) {
// ÏÈÑ¡ÔñÒ»¸ö¾ßÌåµÄ¹¤³§
FoodFactory factory = new ChineseFoodFactory();
// ÓɵÚÒ»²½µÄ¹¤³§²úÉú¾ßÌåµÄ¶ÔÏ󣬲»Í¬µÄ¹¤³§Ôì³ö²»Ò»ÑùµÄ¶ÔÏó
Food food = factory.makeFood("A");
}
} |
ËäÈ»¶¼Êǵ÷Óà makeFood("A") ÖÆ×÷ A ÀàʳÎµ«ÊÇ£¬²»Í¬µÄ¹¤³§Éú²ú³öÀ´µÄÍêÈ«²»Ò»Ñù¡£
µÚÒ»²½£¬ÎÒÃÇÐèҪѡȡºÏÊʵŤ³§£¬È»ºóµÚ¶þ²½»ù±¾ÉϺͼòµ¥¹¤³§Ò»Ñù¡£
ºËÐÄÔÚÓÚ£¬ÎÒÃÇÐèÒªÔÚµÚÒ»²½Ñ¡ºÃÎÒÃÇÐèÒªµÄ¹¤³§¡£±ÈÈ磬ÎÒÃÇÓÐ LogFactory ½Ó¿Ú£¬ÊµÏÖÀàÓÐ
FileLogFactory ºÍ KafkaLogFactory£¬·Ö±ð¶ÔÓ¦½«ÈÕ־дÈëÎļþºÍдÈë Kafka
ÖУ¬ÏÔÈ»£¬ÎÒÃǿͻ§¶ËµÚÒ»²½¾ÍÐèÒª¾ö¶¨µ½µ×ҪʵÀý»¯ FileLogFactory »¹ÊÇ KafkaLogFactory£¬Õ⽫¾ö¶¨Ö®ºóµÄËùÓеIJÙ×÷¡£
ËäÈ»¼òµ¥£¬²»¹ýÎÒÒ²°ÑËùÓеĹ¹¼þ¶¼»µ½Ò»ÕÅͼÉÏ£¬ÕâÑù¶ÁÕß¿´×űȽÏÇåÎú£º

³éÏ󹤳§Ä£Ê½
µ±Éæ¼°µ½²úÆ·×åµÄʱºò£¬¾ÍÐèÒªÒýÈë³éÏ󹤳§Ä£Ê½ÁË¡£
Ò»¸ö¾µäµÄÀý×ÓÊÇÔìһ̨µçÄÔ¡£ÎÒÃÇÏȲ»ÒýÈë³éÏ󹤳§Ä£Ê½£¬¿´¿´ÔõôʵÏÖ¡£
ÒòΪµçÄÔÊÇÓÉÐí¶àµÄ¹¹¼þ×é³ÉµÄ£¬ÎÒÃǽ« CPU ºÍÖ÷°å½øÐгéÏó£¬È»ºó CPU ÓÉ CPUFactory
Éú²ú£¬Ö÷°åÓÉ MainBoardFactory Éú²ú£¬È»ºó£¬ÎÒÃÇÔÙ½« CPU ºÍÖ÷°å´îÅäÆðÀ´×éºÏÔÚÒ»Æð£¬ÈçÏÂͼ£º

Õâ¸öʱºòµÄ¿Í»§¶Ëµ÷ÓÃÊÇÕâÑùµÄ£º
// µÃµ½ Intel µÄ CPU
CPUFactory cpuFactory = new IntelCPUFactory();
CPU cpu = intelCPUFactory.makeCPU();
// µÃµ½ AMD µÄÖ÷°å
MainBoardFactory mainBoardFactory = new AmdMainBoardFactory();
MainBoard mainBoard = mainBoardFactory.make();
// ×é×° CPU ºÍÖ÷°å
Computer computer = new Computer(cpu, mainBoard); |
µ¥¶À¿´ CPU ¹¤³§ºÍÖ÷°å¹¤³§£¬ËüÃÇ·Ö±ðÊÇÇ°ÃæÎÒÃÇ˵µÄ¹¤³§Ä£Ê½¡£ÕâÖÖ·½Ê½Ò²ÈÝÒ×À©Õ¹£¬ÒòΪҪ¸øµçÄÔ¼ÓÓ²Å̵ϰ£¬Ö»ÐèÒª¼ÓÒ»¸ö
HardDiskFactory ºÍÏàÓ¦µÄʵÏÖ¼´¿É£¬²»ÐèÒªÐÞ¸ÄÏÖÓеŤ³§¡£
µ«ÊÇ£¬ÕâÖÖ·½Ê½ÓÐÒ»¸öÎÊÌ⣬ÄǾÍÊÇÈç¹û Intel ¼Ò²úµÄ CPU ºÍ AMD ²úµÄÖ÷°å²»ÄܼæÈÝʹÓã¬ÄÇôÕâ´úÂë¾ÍÈÝÒ׳ö´í£¬ÒòΪ¿Í»§¶Ë²¢²»ÖªµÀËüÃDz»¼æÈÝ£¬Ò²¾Í»á´íÎ󵨳öÏÖËæÒâ×éºÏ¡£
ÏÂÃæ¾ÍÊÇÎÒÃÇҪ˵µÄ²úÆ·×åµÄ¸ÅÄËü´ú±íÁË×é³Éij¸ö²úÆ·µÄһϵÁи½¼þµÄ¼¯ºÏ£º

µ±Éæ¼°µ½ÕâÖÖ²úÆ·×åµÄÎÊÌâµÄʱºò£¬¾ÍÐèÒª³éÏ󹤳§Ä£Ê½À´Ö§³ÖÁË¡£ÎÒÃDz»ÔÙ¶¨Òå CPU ¹¤³§¡¢Ö÷°å¹¤³§¡¢Ó²Å̹¤³§¡¢ÏÔʾÆÁ¹¤³§µÈµÈ£¬ÎÒÃÇÖ±½Ó¶¨ÒåµçÄÔ¹¤³§£¬Ã¿¸öµçÄÔ¹¤³§¸ºÔðÉú²úËùÓеÄÉ豸£¬ÕâÑùÄܱ£Ö¤¿Ï¶¨²»´æÔÚ¼æÈÝÎÊÌâ¡£

Õâ¸öʱºò£¬¶ÔÓÚ¿Í»§¶ËÀ´Ëµ£¬²»ÔÙÐèÒªµ¥¶ÀÌôÑ¡ CPU³§ÉÌ¡¢Ö÷°å³§ÉÌ¡¢Ó²Å̳§É̵ȣ¬Ö±½ÓÑ¡ÔñÒ»¼ÒÆ·ÅÆ¹¤³§£¬Æ·Åƹ¤³§»á¸ºÔðÉú²úËùÓеĶ«Î÷£¬¶øÇÒÄܱ£Ö¤¿Ï¶¨ÊǼæÈÝ¿ÉÓõġ£
public static void main(String[] args) {
// µÚÒ»²½¾ÍҪѡ¶¨Ò»¸ö¡°´ó³§¡±
ComputerFactory cf = new AmdFactory();
// ´ÓÕâ¸ö´ó³§Ôì CPU
CPU cpu = cf.makeCPU();
// ´ÓÕâ¸ö´ó³§ÔìÖ÷°å
MainBoard board = cf.makeMainBoard();
// ´ÓÕâ¸ö´ó³§ÔìÓ²ÅÌ
HardDisk hardDisk = cf.makeHardDisk();
// ½«Í¬Ò»¸ö³§×Ó³öÀ´µÄ CPU¡¢Ö÷°å¡¢Ó²ÅÌ×é×°ÔÚÒ»Æð
Computer result = new Computer(cpu, board, hardDisk);
} |
µ±È»£¬³éÏ󹤳§µÄÎÊÌâÒ²ÊÇÏÔ¶øÒ×¼ûµÄ£¬±ÈÈçÎÒÃÇÒª¼Ó¸öÏÔʾÆ÷£¬¾ÍÐèÒªÐÞ¸ÄËùÓеŤ³§£¬¸øËùÓеŤ³§¶¼¼ÓÉÏÖÆÔìÏÔʾÆ÷µÄ·½·¨¡£ÕâÓеãÎ¥·´Á˶ÔÐ޸Ĺرգ¬¶ÔÀ©Õ¹¿ª·ÅÕâ¸öÉè¼ÆÔÔò¡£
µ¥Àýģʽ
µ¥ÀýģʽÓõÃ×î¶à£¬´íµÃ×î¶à¡£
¶öººÄ£Ê½×î¼òµ¥£º
public class Singleton {
// Ê×ÏÈ£¬½« new Singleton() ¶ÂËÀ
private Singleton() {};
// ´´½¨Ë½Óо²Ì¬ÊµÀý£¬Òâζ×ÅÕâ¸öÀàµÚÒ»´ÎʹÓõÄʱºò¾Í»á½øÐд´½¨
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
// Ϲдһ¸ö¾²Ì¬·½·¨¡£ÕâÀïÏë˵µÄÊÇ£¬Èç¹ûÎÒÃÇÖ»ÊÇÒªµ÷Óà Singleton.getDate(...)£¬
// ±¾À´ÊDz»ÏëÒªÉú³É Singleton ʵÀýµÄ£¬²»¹ýû°ì·¨£¬ÒѾÉú³ÉÁË
public static Date getDate(String mode) {return
new Date();}
} |
ºÜ¶àÈ˶¼ÄÜ˵³ö¶öººÄ£Ê½µÄȱµã£¬¿ÉÊÇÎÒ¾õµÃÉú²ú¹ý³ÌÖУ¬ºÜÉÙÅöµ½ÕâÖÖÇé¿ö£ºÄ㶨ÒåÁËÒ»¸öµ¥ÀýµÄÀ࣬²»ÐèÒªÆäʵÀý£¬¿ÉÊÇÄãÈ´°ÑÒ»¸ö»ò¼¸¸öÄã»áÓõ½µÄ¾²Ì¬·½·¨Èûµ½Õâ¸öÀàÖС£
±¥ººÄ£Ê½×îÈÝÒ׳ö´í£º
public class Singleton {
// Ê×ÏÈ£¬Ò²ÊÇÏȶÂËÀ new Singleton() ÕâÌõ·
private Singleton() {}
// ºÍ¶öººÄ£Ê½Ïà±È£¬Õâ±ß²»ÐèÒªÏÈʵÀý»¯³öÀ´£¬×¢ÒâÕâÀïµÄ volatile£¬ËüÊDZØÐëµÄ
private static volatile Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
// ¼ÓËø
synchronized (Singleton.class) {
// ÕâÒ»´ÎÅжÏÒ²ÊDZØÐëµÄ£¬²»È»»áÓв¢·¢ÎÊÌâ
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
} |
Ë«ÖØ¼ì²é£¬Ö¸µÄÊÇÁ½´Î¼ì²é instance ÊÇ·ñΪ null¡£
volatile ÔÚÕâÀïÊÇÐèÒªµÄ£¬Ï£ÍûÄÜÒýÆð¶ÁÕߵĹØ×¢¡£
ºÜ¶àÈ˲»ÖªµÀÔõôд£¬Ö±½Ó¾ÍÔÚ getInstance() ·½·¨Ç©ÃûÉϼÓÉÏ synchronized£¬Õâ¾Í²»¶à˵ÁË£¬ÐÔÄÜÌ«²î¡£
ǶÌ×Àà×䣬ÒÔºó´ó¼Ò¾ÍÓÃËü°É£º
public class Singleton3 {
private Singleton3() {}
// Ö÷ÒªÊÇʹÓÃÁË Ç¶Ì×Àà¿ÉÒÔ·ÃÎÊÍⲿÀàµÄ¾²Ì¬ÊôÐԺ;²Ì¬·½·¨ µÄÌØÐÔ
private static class Holder {
private static Singleton3 instance = new Singleton3();
}
public static Singleton3 getInstance() {
return Holder.instance;
}
} |
×¢Ò⣬ºÜ¶àÈ˶¼»á°ÑÕâ¸öǶÌ×Àà˵³ÉÊǾ²Ì¬ÄÚ²¿À࣬ÑϸñµØËµ£¬ÄÚ²¿ÀàºÍǶÌ×ÀàÊDz»Ò»ÑùµÄ£¬ËüÃÇÄÜ·ÃÎʵÄÍⲿÀàȨÏÞÒ²ÊDz»Ò»ÑùµÄ¡£
×îºó£¬ÎÒÃÇ˵һÏÂö¾Ù£¬Ã¶¾ÙºÜÌØÊ⣬ËüÔÚÀà¼ÓÔØµÄʱºò»á³õʼ»¯ÀïÃæµÄËùÓеÄʵÀý£¬¶øÇÒ JVM ±£Ö¤ÁËËüÃDz»»áÔÙ±»ÊµÀý»¯£¬ËùÒÔËüÌìÉú¾ÍÊǵ¥ÀýµÄ¡£
ËäÈ»ÎÒÃÇÆ½Ê±ºÜÉÙ¿´µ½ÓÃö¾ÙÀ´ÊµÏÖµ¥Àý£¬µ«ÊÇÔÚ RxJava µÄÔ´ÂëÖУ¬ÓÐºÜ¶àµØ·½¶¼ÓÃÁËö¾ÙÀ´ÊµÏÖµ¥Àý¡£
½¨ÔìÕßģʽ
¾³£Åö¼ûµÄ XxxBuilder µÄÀ࣬ͨ³£¶¼Êǽ¨ÔìÕßģʽµÄ²úÎï¡£½¨ÔìÕßģʽÆäʵÓкܶàµÄ±äÖÖ£¬µ«ÊǶÔÓÚ¿Í»§¶ËÀ´Ëµ£¬ÎÒÃǵÄʹÓÃͨ³£¶¼ÊÇÒ»¸öģʽµÄ£º
Food food = new FoodBuilder().a().b().c().build();
Food food = Food.builder().a().b().c().build();
Ì×·¾ÍÊÇÏÈ new Ò»¸ö Builder£¬È»ºó¿ÉÒÔÁ´Ê½µØµ÷ÓÃÒ»¶Ñ·½·¨£¬×îºóÔÙµ÷ÓÃÒ»´Î build()
·½·¨£¬ÎÒÃÇÐèÒªµÄ¶ÔÏó¾ÍÓÐÁË¡£
À´Ò»¸öÖйæÖоصĽ¨ÔìÕßģʽ£º
class User {
// ÏÂÃæÊÇ¡°Ò»¶Ñ¡±µÄÊôÐÔ
private String name;
private String password;
private String nickName;
private int age;
// ¹¹Ôì·½·¨Ë½Óл¯£¬²»È»¿Í»§¶Ë¾Í»áÖ±½Óµ÷Óù¹Ôì·½·¨ÁË
private User(String name, String password, String
nickName, int age) {
this.name = name;
this.password = password;
this.nickName = nickName;
this.age = age;
}
// ¾²Ì¬·½·¨£¬ÓÃÓÚÉú³ÉÒ»¸ö Builder£¬Õâ¸ö²»Ò»¶¨ÒªÓУ¬²»¹ýдÕâ¸ö·½·¨ÊÇÒ»¸öºÜºÃµÄϰ¹ß£¬
// ÓÐЩ´úÂëÒªÇó±ðÈËд new User.UserBuilder().a()...build()
¿´ÉÏÈ¥¾ÍûÄÇôºÃ
public static UserBuilder builder() {
return new UserBuilder();
}
public static class UserBuilder {
// ÏÂÃæÊÇºÍ User һģһÑùµÄÒ»¶ÑÊôÐÔ
private String name;
private String password;
private String nickName;
private int age;
private UserBuilder() {
}
// Á´Ê½µ÷ÓÃÉèÖø÷¸öÊôÐÔÖµ£¬·µ»Ø this£¬¼´ UserBuilder
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder password(String password)
{
this.password = password;
return this;
}
public UserBuilder nickName(String nickName)
{
this.nickName = nickName;
return this;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
// build() ·½·¨¸ºÔ𽫠UserBuilder ÖÐÉèÖúõÄÊôÐÔ¡°¸´ÖÆ¡±µ½
User ÖС£
// µ±È»£¬¿ÉÒÔÔÚ ¡°¸´ÖÆ¡± ֮ǰ×öµã¼ìÑé
public User build() {
if (name == null || password == null) {
throw new RuntimeException("Óû§ÃûºÍÃÜÂë±ØÌî");
}
if (age <= 0 || age >= 150) {
throw new RuntimeException("ÄêÁä²»ºÏ·¨");
}
// »¹¿ÉÒÔ×ö¸³Ó衱ĬÈÏÖµ¡°µÄ¹¦ÄÜ
if (nickName == null) {
nickName = name;
}
return new User(name, password, nickName, age);
}
}
} |
ºËÐÄÊÇ£ºÏȰÑËùÓеÄÊôÐÔ¶¼ÉèÖøø Builder£¬È»ºó build() ·½·¨µÄʱºò£¬½«ÕâЩÊôÐÔ¸´ÖƸøÊµ¼Ê²úÉúµÄ¶ÔÏó¡£
¿´¿´¿Í»§¶ËµÄµ÷Óãº
public class
APP {
public static void main(String[] args) {
User d = User.builder()
.name("foo")
.password("pAss12345")
.age(25)
.build();
}
} |
˵ʵ»°£¬½¨ÔìÕßģʽµÄÁ´Ê½Ð´·¨ºÜÎüÒýÈË£¬µ«ÊÇ£¬¶àдÁ˺ܶࡰÎÞÓá±µÄ builder µÄ´úÂ룬¸Ð¾õÕâ¸öģʽûʲôÓᣲ»¹ý£¬µ±ÊôÐԺܶ࣬¶øÇÒÓÐЩ±ØÌÓÐЩѡÌîµÄʱºò£¬Õâ¸öģʽ»áʹ´úÂëÇåÎúºÜ¶à¡£ÎÒÃÇ¿ÉÒÔÔÚ
Builder µÄ¹¹Ôì·½·¨ÖÐÇ¿ÖÆÈõ÷ÓÃÕßÌṩ±ØÌî×ֶΣ¬»¹ÓУ¬ÔÚ build() ·½·¨ÖÐУÑé¸÷¸ö²ÎÊý±ÈÔÚ
User µÄ¹¹Ôì·½·¨ÖÐУÑ飬´úÂëÒªÓÅÑÅһЩ¡£
ÌâÍâ»°£¬Ç¿ÁÒ½¨Òé¶ÁÕßʹÓà lombok£¬ÓÃÁË lombok ÒÔºó£¬ÉÏÃæµÄÒ»´ó¶Ñ´úÂë»á±ä³ÉÈçÏÂÕâÑù:
@Builder
class User {
private String name;
private String password;
private String nickName;
private int age;
} |
ÔõôÑù£¬Ê¡ÏÂÀ´µÄʱ¼äÊDz»ÊÇÓÖ¿ÉÒԸɵã±ðµÄÁË¡£
µ±È»£¬Èç¹ûÄãÖ»ÊÇÏëÒªÁ´Ê½Ð´·¨£¬²»ÏëÒª½¨ÔìÕßģʽ£¬ÓиöºÜ¼òµ¥µÄ°ì·¨£¬User µÄ getter ·½·¨²»±ä£¬ËùÓеÄ
setter ·½·¨¶¼ÈÃÆä return this ¾Í¿ÉÒÔÁË£¬È»ºó¾Í¿ÉÒÔÏñÏÂÃæÕâÑùµ÷Óãº
User user = new User().setName("").setPassword("").setAge(20);
ºÜ¶àÈËÊÇÕâôÓõ쬵«ÊDZÊÕß¾õµÃÆäʵÕâÖÖд·¨·Ç³£µØ²»ÓÅÑÅ£¬²»ÊǺÜÍÆ¼öʹÓá£
ÔÐÍģʽ
ÕâÊÇÎÒҪ˵µÄ´´½¨ÐÍģʽµÄ×îºóÒ»¸öÉè¼ÆÄ£Ê½ÁË¡£
ÔÐÍģʽºÜ¼òµ¥£ºÓÐÒ»¸öÔÐÍʵÀý£¬»ùÓÚÕâ¸öÔÐÍʵÀý²úÉúеÄʵÀý£¬Ò²¾ÍÊÇ¡°¿Ë¡¡±ÁË¡£
Object ÀàÖÐÓÐÒ»¸ö clone() ·½·¨£¬ËüÓÃÓÚÉú³ÉÒ»¸öеĶÔÏ󣬵±È»£¬Èç¹ûÎÒÃÇÒªµ÷ÓÃÕâ¸ö·½·¨£¬java
ÒªÇóÎÒÃǵÄÀà±ØÐëÏÈʵÏÖ Cloneable ½Ó¿Ú£¬´Ë½Ó¿ÚûÓж¨ÒåÈκη½·¨£¬µ«ÊDz»Õâô×öµÄ»°£¬ÔÚ clone()
µÄʱºò£¬»áÅ׳ö CloneNotSupportedException Òì³£¡£
protected native Object clone() throws CloneNotSupportedException;
java µÄ¿Ë¡ÊÇdz¿Ë¡£¬Åöµ½¶ÔÏóÒýÓõÄʱºò£¬¿Ë¡³öÀ´µÄ¶ÔÏóºÍÔ¶ÔÏóÖеÄÒýÓý«Ö¸Ïòͬһ¸ö¶ÔÏó¡£Í¨³£ÊµÏÖÉî¿Ë¡µÄ·½·¨Êǽ«¶ÔÏó½øÐÐÐòÁл¯£¬È»ºóÔÙ½øÐз´ÐòÁл¯¡£
ÔÐÍģʽÁ˽⵽ÕâÀïÎÒ¾õµÃ¾Í¹»ÁË£¬¸÷ÖÖ±ä×Å·¨×Ó˵ÕâÖÖ´úÂë»òÄÇÖÖ´úÂëÊÇÔÐÍģʽ£¬Ã»Ê²Ã´ÒâÒå¡£
´´½¨ÐÍģʽ×ܽá
´´½¨ÐÍģʽ×ÜÌåÉϱȽϼòµ¥£¬ËüÃǵÄ×÷ÓþÍÊÇΪÁ˲úÉúʵÀý¶ÔÏó£¬ËãÊǸ÷ÖÖ¹¤×÷µÄµÚÒ»²½ÁË£¬ÒòΪÎÒÃÇдµÄÊÇÃæÏò¶ÔÏóµÄ´úÂ룬ËùÒÔÎÒÃǵÚÒ»²½µ±È»ÊÇÐèÒª´´½¨Ò»¸ö¶ÔÏóÁË¡£
¼òµ¥¹¤³§Ä£Ê½×î¼òµ¥£»¹¤³§Ä£Ê½ÔÚ¼òµ¥¹¤³§Ä£Ê½µÄ»ù´¡ÉÏÔö¼ÓÁËÑ¡Ôñ¹¤³§µÄά¶È£¬ÐèÒªµÚÒ»²½Ñ¡ÔñºÏÊʵŤ³§£»³éÏ󹤳§Ä£Ê½ÓвúÆ·×åµÄ¸ÅÄÈç¹û¸÷¸ö²úÆ·ÊÇ´æÔÚ¼æÈÝÐÔÎÊÌâµÄ£¬¾ÍÒªÓóéÏ󹤳§Ä£Ê½¡£µ¥Àýģʽ¾Í²»ËµÁË£¬ÎªÁ˱£Ö¤È«¾ÖʹÓõÄÊÇͬһ¶ÔÏó£¬Ò»·½ÃæÊǰ²È«ÐÔ¿¼ÂÇ£¬Ò»·½ÃæÊÇΪÁ˽ÚÊ¡×ÊÔ´£»½¨ÔìÕßģʽרÃŶԸ¶ÊôÐԺܶàµÄÄÇÖÖÀ࣬ΪÁËÈôúÂë¸üÓÅÃÀ£»ÔÐÍģʽÓõÃ×îÉÙ£¬Á˽âºÍ
Object ÀàÖÐµÄ clone() ·½·¨Ïà¹ØµÄ֪ʶ¼´¿É¡£
½á¹¹ÐÍģʽ
Ç°Ãæ´´½¨ÐÍģʽ½éÉÜÁË´´½¨¶ÔÏóµÄһЩÉè¼ÆÄ£Ê½£¬Õâ½Ú½éÉܵĽṹÐÍģʽּÔÚͨ¹ý¸Ä±ä´úÂë½á¹¹À´´ïµ½½âñîµÄÄ¿µÄ£¬Ê¹µÃÎÒÃǵĴúÂëÈÝÒ×ά»¤ºÍÀ©Õ¹¡£
´úÀíģʽ
µÚÒ»¸öÒª½éÉܵĴúÀíģʽÊÇ×ʹÓõÄģʽ֮һÁË£¬ÓÃÒ»¸ö´úÀíÀ´Òþ²Ø¾ßÌåʵÏÖÀàµÄʵÏÖϸ½Ú£¬Í¨³£»¹ÓÃÓÚÔÚÕæÊµµÄʵÏÖµÄǰºóÌí¼ÓÒ»²¿·ÖÂß¼¡£
¼ÈȻ˵ÊÇ´úÀí£¬ÄǾÍÒª¶Ô¿Í»§¶ËÒþ²ØÕæÊµÊµÏÖ£¬ÓÉ´úÀíÀ´¸ºÔð¿Í»§¶ËµÄËùÓÐÇëÇó¡£µ±È»£¬´úÀíÖ»ÊǸö´úÀí£¬Ëü²»»áÍê³Éʵ¼ÊµÄÒµÎñÂß¼£¬¶øÊÇÒ»²ãƤ¶øÒÑ£¬µ«ÊǶÔÓÚ¿Í»§¶ËÀ´Ëµ£¬Ëü±ØÐë±íÏֵþÍÊǿͻ§¶ËÐèÒªµÄÕæÊµÊµÏÖ¡£
Àí½â´úÀíÕâ¸ö´Ê£¬Õâ¸öģʽÆäʵ¾Í¼òµ¥ÁË¡£
public interface FoodService {
Food makeChicken();
Food makeNoodle();
}
public class FoodServiceImpl implements FoodService
{
public Food makeChicken() {
Food f = new Chicken()
f.setChicken("1kg");
f.setSpicy("1g");
f.setSalt("3g");
return f;
}
public Food makeNoodle() {
Food f = new Noodle();
f.setNoodle("500g");
f.setSalt("5g");
return f;
}
}
// ´úÀíÒª±íÏֵá°¾ÍÏñÊÇ¡±ÕæÊµÊµÏÖÀ࣬ËùÒÔÐèҪʵÏÖ FoodService
public class FoodServiceProxy implements FoodService
{
// ÄÚ²¿Ò»¶¨ÒªÓÐÒ»¸öÕæÊµµÄʵÏÖÀ࣬µ±È»Ò²¿ÉÒÔͨ¹ý¹¹Ôì·½·¨×¢Èë
private FoodService foodService = new FoodServiceImpl();
public Food makeChicken() {
System.out.println("ÎÒÃÇÂíÉÏÒª¿ªÊ¼ÖÆ×÷¼¦ÈâÁË");
// Èç¹ûÎÒÃǶ¨ÒåÕâ¾äΪºËÐÄ´úÂëµÄ»°£¬ÄÇô£¬ºËÐÄ´úÂëÊÇÕæÊµÊµÏÖÀà×öµÄ£¬
// ´úÀíÖ»ÊÇÔÚºËÐÄ´úÂëǰºó×öЩ¡°ÎÞ×ãÇáÖØ¡±µÄÊÂÇé
Food food = foodService.makeChicken();
System.out.println("¼¦ÈâÖÆ×÷Íê³ÉÀ²£¬¼Óµãºú½··Û");
// ÔöÇ¿
food.addCondiment("pepper");
return food;
}
public Food makeNoodle() {
System.out.println("×¼±¸ÖÆ×÷ÀÃæ~");
Food food = foodService.makeNoodle();
System.out.println("ÖÆ×÷Íê³ÉÀ²")
return food;
}
} |
¿Í»§¶Ëµ÷Óã¬×¢Ò⣬ÎÒÃÇÒªÓôúÀíÀ´ÊµÀý»¯½Ó¿Ú£º
// ÕâÀïÓôúÀíÀàÀ´ÊµÀý»¯
FoodService foodService = new FoodServiceProxy();
foodService.makeChicken(); |

proxy
ÎÒÃÇ·¢ÏÖûÓУ¬´úÀíģʽ˵°×Á˾ÍÊÇ×ö ¡°·½·¨°ü×°¡± »ò×ö ¡°·½·¨ÔöÇ¿¡±¡£ÔÚÃæÏòÇÐÃæ±à³ÌÖУ¬Æäʵ¾ÍÊǶ¯Ì¬´úÀíµÄ¹ý³Ì¡£±ÈÈç
Spring ÖУ¬ÎÒÃÇ×Ô¼º²»¶¨Òå´úÀíÀ࣬µ«ÊÇ Spring »á°ïÎÒÃǶ¯Ì¬À´¶¨Òå´úÀí£¬È»ºó°ÑÎÒÃǶ¨ÒåÔÚ
@Before¡¢@After¡¢@Around ÖеĴúÂëÂß¼¶¯Ì¬Ìí¼Óµ½´úÀíÖС£
˵µ½¶¯Ì¬´úÀí£¬ÓÖ¿ÉÒÔÕ¹¿ªËµ£¬Spring ÖÐʵÏÖ¶¯Ì¬´úÀíÓÐÁ½ÖÖ£¬Ò»ÖÖÊÇÈç¹ûÎÒÃǵÄÀඨÒåÁ˽ӿڣ¬Èç
UserService ½Ó¿ÚºÍ UserServiceImpl ʵÏÖ£¬ÄÇô²ÉÓà JDK µÄ¶¯Ì¬´úÀí£¬¸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔÈ¥¿´¿´
java.lang.reflect.Proxy ÀàµÄÔ´Â룻ÁíÒ»ÖÖÊÇÎÒÃÇ×Ô¼ºÃ»Óж¨Òå½Ó¿ÚµÄ£¬Spring
»á²ÉÓà CGLIB ½øÐж¯Ì¬´úÀí£¬ËüÊÇÒ»¸ö jar °ü£¬ÐÔÄÜ»¹²»´í¡£
ÊÊÅäÆ÷ģʽ
˵Íê´úÀíģʽ£¬ËµÊÊÅäÆ÷ģʽ£¬ÊÇÒòΪËüÃǺÜÏàËÆ£¬ÕâÀï¿ÉÒÔ×ö¸ö±È½Ï¡£
ÊÊÅäÆ÷ģʽ×öµÄ¾ÍÊÇ£¬ÓÐÒ»¸ö½Ó¿ÚÐèҪʵÏÖ£¬µ«ÊÇÎÒÃÇÏֳɵĶÔÏó¶¼²»Âú×㣬ÐèÒª¼ÓÒ»²ãÊÊÅäÆ÷À´½øÐÐÊÊÅä¡£
ÊÊÅäÆ÷ģʽ×ÜÌåÀ´Ëµ·ÖÈýÖÖ£ºÄ¬ÈÏÊÊÅäÆ÷ģʽ¡¢¶ÔÏóÊÊÅäÆ÷ģʽ¡¢ÀàÊÊÅäÆ÷ģʽ¡£ÏȲ»¼±×Å·ÖÇå³þÕ⼸¸ö£¬ÏÈ¿´¿´Àý×ÓÔÙ˵¡£
ĬÈÏÊÊÅäÆ÷ģʽ
Ê×ÏÈ£¬ÎÒÃÇÏÈ¿´¿´×î¼òµ¥µÄÊÊÅäÆ÷ģʽĬÈÏÊÊÅäÆ÷ģʽ(Default Adapter)ÊÇÔõôÑùµÄ¡£
ÎÒÃÇÓà Appache commons-io °üÖÐµÄ FileAlterationListener
×öÀý×Ó£¬´Ë½Ó¿Ú¶¨ÒåÁ˺ܶàµÄ·½·¨£¬ÓÃÓÚ¶ÔÎļþ»òÎļþ¼Ð½øÐÐ¼à¿Ø£¬Ò»µ©·¢ÉúÁ˶ÔÓ¦µÄ²Ù×÷£¬¾Í»á´¥·¢ÏàÓ¦µÄ·½·¨¡£
public interface FileAlterationListener {
void onStart(final FileAlterationObserver observer);
void onDirectoryCreate(final File directory);
void onDirectoryChange(final File directory);
void onDirectoryDelete(final File directory);
void onFileCreate(final File file);
void onFileChange(final File file);
void onFileDelete(final File file);
void onStop(final FileAlterationObserver observer);
}
|
´Ë½Ó¿ÚµÄÒ»´óÎÊÌâÊdzéÏó·½·¨Ì«¶àÁË£¬Èç¹ûÎÒÃÇÒªÓÃÕâ¸ö½Ó¿Ú£¬Òâζ×ÅÎÒÃÇҪʵÏÖÿһ¸ö³éÏó·½·¨£¬Èç¹ûÎÒÃÇÖ»ÊÇÏëÒª¼à¿ØÎļþ¼ÐÖеÄÎļþ´´½¨ºÍÎļþɾ³ýʼþ£¬¿ÉÊÇÎÒÃÇ»¹ÊDz»µÃ²»ÊµÏÖËùÓеķ½·¨£¬ºÜÃ÷ÏÔ£¬Õâ²»ÊÇÎÒÃÇÏëÒªµÄ¡£
ËùÒÔ£¬ÎÒÃÇÐèÒªÏÂÃæµÄÒ»¸öÊÊÅäÆ÷£¬ËüÓÃÓÚʵÏÖÉÏÃæµÄ½Ó¿Ú£¬µ«ÊÇËùÓеķ½·¨¶¼Êǿշ½·¨£¬ÕâÑù£¬ÎÒÃǾͿÉÒÔת¶ø¶¨Òå×Ô¼ºµÄÀàÀ´¼Ì³ÐÏÂÃæÕâ¸öÀ༴¿É¡£
public class FileAlterationListenerAdaptor
implements FileAlterationListener {
public void onStart(final FileAlterationObserver
observer) {
}
public void onDirectoryCreate(final File directory)
{
}
public void onDirectoryChange(final File directory)
{
}
public void onDirectoryDelete(final File directory)
{
}
public void onFileCreate(final File file)
{
}
public void onFileChange(final File file)
{
}
public void onFileDelete(final File file)
{
}
public void onStop(final FileAlterationObserver
observer) {
}
} |
±ÈÈçÎÒÃÇ¿ÉÒÔ¶¨ÒåÒÔÏÂÀ࣬ÎÒÃǽö½öÐèҪʵÏÖÎÒÃÇÏëʵÏֵķ½·¨¾Í¿ÉÒÔÁË£º
public class FileMonitor extends FileAlterationListenerAdaptor
{
public void onFileCreate(final File file) {
// Îļþ´´½¨
doSomething();
}
public void onFileDelete(final File file)
{
// Îļþɾ³ý
doSomething();
}
} |
µ±È»£¬ÉÏÃæËµµÄÖ»ÊÇÊÊÅäÆ÷ģʽµÄÆäÖÐÒ»ÖÖ£¬Ò²ÊÇ×î¼òµ¥µÄÒ»ÖÖ£¬ÎÞÐè¶àÑÔ¡£ÏÂÃæ£¬ÔÙ½éÉÜ¡°ÕýͳµÄ¡±ÊÊÅäÆ÷ģʽ¡£
¶ÔÏóÊÊÅäÆ÷ģʽ
À´¿´Ò»¸ö¡¶Head First Éè¼ÆÄ£Ê½¡·ÖеÄÒ»¸öÀý×Ó£¬ÎÒÉÔ΢ÐÞ¸ÄÁËһϣ¬¿´¿´Ôõô½«¼¦ÊÊÅä³ÉѼ£¬ÕâÑù¼¦Ò²Äܵ±Ñ¼À´Óá£ÒòΪ£¬ÏÖÔÚѼÕâ¸ö½Ó¿Ú£¬ÎÒÃÇûÓкÏÊʵÄʵÏÖÀà¿ÉÒÔÓã¬ËùÒÔÐèÒªÊÊÅäÆ÷¡£
public interface Duck {
public void quack(); // ѼµÄßÉßɽÐ
public void fly(); // ·É
}
public interface Cock {
public void gobble(); // ¼¦µÄ¹¾¹¾½Ð
public void fly(); // ·É
}
public class WildCock implements Cock {
public void gobble() {
System.out.println("¹¾¹¾½Ð");
}
public void fly() {
System.out.println("¼¦Ò²»á·ÉŶ");
}
} |
Ѽ½Ó¿ÚÓÐ fly() ºÍ quare() Á½¸ö·½·¨£¬¼¦ Cock Èç¹ûҪð³äѼ£¬fly() ·½·¨ÊÇÏֳɵ쬵«ÊǼ¦²»»áѼµÄßÉßɽУ¬Ã»ÓÐ
quack() ·½·¨¡£Õâ¸öʱºò¾ÍÐèÒªÊÊÅäÁË£º
// ºÁÎÞÒÉÎÊ£¬Ê×ÏÈ£¬Õâ¸öÊÊÅäÆ÷¿Ï¶¨ÐèÒª implements Duck£¬ÕâÑù²ÅÄܵ±×öѼÀ´ÓÃ
public class CockAdapter implements Duck {
Cock cock;
// ¹¹Ôì·½·¨ÖÐÐèÒªÒ»¸ö¼¦µÄʵÀý£¬´ËÀà¾ÍÊǽ«ÕâÖ»¼¦ÊÊÅä³ÉѼÀ´ÓÃ
public CockAdapter(Cock cock) {
this.cock = cock;
}
// ʵÏÖѼµÄßÉßɽз½·¨
@Override
public void quack() {
// ÄÚ²¿ÆäʵÊÇÒ»Ö»¼¦µÄ¹¾¹¾½Ð
cock.gobble();
}
@Override
public void fly() {
cock.fly();
}
} |
¿Í»§¶Ëµ÷Óúܼòµ¥ÁË£º
public static void main(String[] args) {
// ÓÐÒ»Ö»Ò°¼¦
Cock wildCock = new WildCock();
// ³É¹¦½«Ò°¼¦ÊÊÅä³ÉѼ
Duck duck = new CockAdapter(wildCock);
...
} |
µ½ÕâÀ´ó¼ÒÒ²¾ÍÖªµÀÁËÊÊÅäÆ÷ģʽÊÇÔõô»ØÊÂÁË¡£ÎÞ·ÇÊÇÎÒÃÇÐèҪһֻѼ£¬µ«ÊÇÎÒÃÇÖ»ÓÐÒ»Ö»¼¦£¬Õâ¸öʱºò¾ÍÐèÒª¶¨ÒåÒ»¸öÊÊÅäÆ÷£¬ÓÉÕâ¸öÊÊÅäÆ÷À´³äµ±Ñ¼£¬µ«ÊÇÊÊÅäÆ÷ÀïÃæµÄ·½·¨»¹ÊÇÓɼ¦À´ÊµÏֵġ£
ÎÒÃÇÓÃÒ»¸öͼÀ´¼òµ¥ËµÃ÷Ï£º

ÉÏͼӦ¸Ã»¹ÊǺÜÈÝÒ×Àí½âµÄ£¬ÎҾͲ»×ö¸ü¶àµÄ½âÊÍÁË¡£ÏÂÃæ£¬ÎÒÃÇ¿´¿´ÀàÊÊÅäģʽÔõôÑùµÄ¡£
ÀàÊÊÅäÆ÷ģʽ
·Ï»°ÉÙ˵£¬Ö±½ÓÉÏͼ£º

adapter-1
¿´µ½Õâ¸öͼ£¬´ó¼ÒÓ¦¸ÃºÜÈÝÒ×Àí½âµÄ°É£¬Í¨¹ý¼Ì³ÐµÄ·½·¨£¬ÊÊÅäÆ÷×Ô¶¯»ñµÃÁËËùÐèÒªµÄ´ó²¿·Ö·½·¨¡£Õâ¸öʱºò£¬¿Í»§¶ËʹÓøü¼Ó¼òµ¥£¬Ö±½Ó
Target t = new SomeAdapter(); ¾Í¿ÉÒÔÁË¡£
ÊÊÅäÆ÷ģʽ×ܽá
ÀàÊÊÅäºÍ¶ÔÏóÊÊÅäµÄÒìͬ
Ò»¸ö²ÉÓü̳У¬Ò»¸ö²ÉÓÃ×éºÏ£»
ÀàÊÊÅäÊôÓÚ¾²Ì¬ÊµÏÖ£¬¶ÔÏóÊÊÅäÊôÓÚ×éºÏµÄ¶¯Ì¬ÊµÏÖ£¬¶ÔÏóÊÊÅäÐèÒª¶àʵÀý»¯Ò»¸ö¶ÔÏó¡£
×ÜÌåÀ´Ëµ£¬¶ÔÏóÊÊÅäÓõñȽ϶ࡣ
ÊÊÅäÆ÷ģʽºÍ´úÀíģʽµÄÒìͬ
±È½ÏÕâÁ½ÖÖģʽ£¬ÆäʵÊDZȽ϶ÔÏóÊÊÅäÆ÷ģʽºÍ´úÀíģʽ£¬ÔÚ´úÂë½á¹¹ÉÏ£¬ËüÃǺÜÏàËÆ£¬¶¼ÐèÒªÒ»¸ö¾ßÌåµÄʵÏÖÀàµÄʵÀý¡£µ«ÊÇËüÃǵÄÄ¿µÄ²»Ò»Ñù£¬´úÀíģʽ×öµÄÊÇÔöǿԷ½·¨µÄ»î£»ÊÊÅäÆ÷×öµÄÊÇÊÊÅäµÄ»î£¬ÎªµÄÊÇÌṩ¡°°Ñ¼¦°ü×°³ÉѼ£¬È»ºóµ±×öѼÀ´Ê¹Óá±£¬¶ø¼¦ºÍѼËüÃÇÖ®¼äÔ±¾Ã»Óм̳йØÏµ¡£

ÇÅÁºÄ£Ê½
Àí½âÇÅÁºÄ£Ê½£¬Æäʵ¾ÍÊÇÀí½â´úÂë³éÏóºÍ½âñî¡£
ÎÒÃÇÊ×ÏÈÐèÒªÒ»¸öÇÅÁº£¬ËüÊÇÒ»¸ö½Ó¿Ú£¬¶¨ÒåÌṩµÄ½Ó¿Ú·½·¨¡£
public interface DrawAPI {
public void draw(int radius, int x, int y);
} |
È»ºóÊÇһϵÁÐʵÏÖÀࣺ
public class RedPen implements DrawAPI {
@Override
public void draw(int radius, int x, int y) {
System.out.println("ÓúìÉ«±Ê»Í¼£¬radius:"
+ radius + ", x:" + x + ", y:"
+ y);
}
}
public class GreenPen implements DrawAPI {
@Override
public void draw(int radius, int x, int y) {
System.out.println("ÓÃÂÌÉ«±Ê»Í¼£¬radius:"
+ radius + ", x:" + x + ", y:"
+ y);
}
}
public class BluePen implements DrawAPI {
@Override
public void draw(int radius, int x, int y) {
System.out.println("ÓÃÀ¶É«±Ê»Í¼£¬radius:"
+ radius + ", x:" + x + ", y:"
+ y);
}
} |
¶¨ÒåÒ»¸ö³éÏóÀ࣬´ËÀàµÄʵÏÖÀà¶¼ÐèҪʹÓà DrawAPI£º
public abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI) {
this.drawAPI = drawAPI;
}
public abstract void draw();
} |
¶¨Òå³éÏóÀàµÄ×ÓÀࣺ
×îºó£¬ÎÒÃÇÀ´¿´¿Í»§¶ËÑÝʾ£º
¿ÉÄÜ´ó¼Ò¿´ÉÏÃæÒ»²½²½»¹²»ÊÇÌØ±ðÇåÎú£¬ÎÒ°ÑËùÓеĶ«Î÷ÕûºÏµ½Ò»ÕÅͼÉÏ£º

Õâ»Ø´ó¼ÒÓ¦¸Ã¾ÍÖªµÀ³éÏóÔÚÄÄÀÔõô½âñîÁ˰ɡ£ÇÅÁºÄ£Ê½µÄÓŵãÒ²ÊÇÏÔ¶øÒ×¼ûµÄ£¬¾ÍÊǷdz£ÈÝÒ×½øÐÐÀ©Õ¹¡£
±¾½ÚÒýÓÃÁËÕâÀïµÄÀý×Ó£¬²¢¶ÔÆä½øÐÐÁËÐ޸ġ£
×°ÊÎģʽ
Òª°Ñ×°ÊÎģʽ˵Çå³þÃ÷°×£¬²»ÊǼþÈÝÒ×µÄÊÂÇé¡£Ò²Ðí¶ÁÕßÖªµÀ Java IO ÖеöÀàÊǵäÐ͵Ä×°ÊÎģʽµÄÓ¦Ó㬵«ÊǶÁÕß²»Ò»¶¨Çå³þÆäÖеĹØÏµ£¬Ò²Ðí¿´Íê¾ÍÍüÁË£¬Ï£Íû¿´ÍêÕâ½Úºó£¬¶ÁÕß¿ÉÒÔ¶ÔÆäÓиüÉîµÄ¸ÐÎò¡£
Ê×ÏÈ£¬ÎÒÃÇÏÈ¿´Ò»¸ö¼òµ¥µÄͼ£¬¿´Õâ¸öͼµÄʱºò£¬Á˽âϲã´Î½á¹¹¾Í¿ÉÒÔÁË£º

ÎÒÃÇÀ´ËµËµ×°ÊÎģʽµÄ³ö·¢µã£¬´ÓͼÖпÉÒÔ¿´µ½£¬½Ó¿Ú Component ÆäʵÒѾÓÐÁË ConcreteComponentA
ºÍ ConcreteComponentB Á½¸öʵÏÖÀàÁË£¬µ«ÊÇ£¬Èç¹ûÎÒÃÇÒªÔöÇ¿ÕâÁ½¸öʵÏÖÀàµÄ»°£¬ÎÒÃǾͿÉÒÔ²ÉÓÃ×°ÊÎģʽ£¬ÓþßÌåµÄ×°ÊÎÆ÷À´×°ÊÎʵÏÖÀ࣬ÒÔ´ïµ½ÔöÇ¿µÄÄ¿µÄ¡£
´ÓÃû×ÖÀ´¼òµ¥½âÊÍÏÂ×°ÊÎÆ÷¡£¼ÈȻ˵ÊÇ×°ÊΣ¬ÄÇôÍùÍù¾ÍÊÇÌí¼ÓС¹¦ÄÜÕâÖÖ£¬¶øÇÒ£¬ÎÒÃÇÒªÂú×ã¿ÉÒÔÌí¼Ó¶à¸öС¹¦ÄÜ¡£×î¼òµ¥µÄ£¬´úÀíģʽ¾Í¿ÉÒÔʵÏÖ¹¦ÄܵÄÔöÇ¿£¬µ«ÊÇ´úÀí²»ÈÝÒ×ʵÏÖ¶à¸ö¹¦ÄܵÄÔöÇ¿£¬µ±È»Äã¿ÉÒÔ˵ÓôúÀí°ü×°´úÀíµÄ¶à²ã°ü×°·½Ê½£¬µ«ÊÇÄÇÑùµÄ»°´úÂë¾Í¸´ÔÓÁË¡£
Ê×ÏÈÃ÷°×һЩ¼òµ¥µÄ¸ÅÄ´ÓͼÖÐÎÒÃÇ¿´µ½£¬ËùÓеľßÌå×°ÊÎÕßÃÇ ConcreteDecorator* ¶¼¿ÉÒÔ×÷Ϊ
Component À´Ê¹Óã¬ÒòΪËüÃǶ¼ÊµÏÖÁË Component ÖеÄËùÓнӿڡ£ËüÃÇºÍ Component
ʵÏÖÀà ConcreteComponent* µÄÇø±ðÊÇ£¬ËüÃÇÖ»ÊÇ×°ÊÎÕߣ¬Æð×°ÊÎ×÷Óã¬Ò²¾ÍÊǼ´Ê¹ËüÃÇ¿´ÉÏȥţ±Æºäºä£¬µ«ÊÇËüÃǶ¼Ö»ÊÇÔÚ¾ßÌåµÄʵÏÖÖмÓÁË²ãÆ¤À´×°ÊζøÒÑ¡£
×¢ÒâÕâ¶Î»°ÖлìÔÓÔÚ¸÷¸öÃû´ÊÖÐµÄ Component ºÍ Decorator£¬±ð¸ã»ìÁË¡£
ÏÂÃæÀ´¿´¿´Ò»¸öÀý×Ó£¬ÏȰÑ×°ÊÎģʽŪÇå³þ£¬È»ºóÔÙ½éÉÜÏ java io ÖеÄ×°ÊÎģʽµÄÓ¦Óá£
×î½ü´ó½ÖÉÏÁ÷ÐÐÆðÀ´ÁË¡°¿ìÀÖÄûÃÊ¡±£¬ÎÒÃǰѿìÀÖÄûÃʵÄÒûÁÏ·ÖΪÈýÀࣺºì²è¡¢Â̲衢¿§·È£¬ÔÚÕâÈý´óÀàµÄ»ù´¡ÉÏ£¬ÓÖÔö¼ÓÁËÐí¶àµÄ¿Úζ£¬Ê²Ã´½ð½ÛÄûÃʺì²è¡¢½ð½ÛÄûÃÊÕäÖéÂ̲衢â¹ûºì²è¡¢Ã¢¹ûÂ̲衢â¹ûÕäÖéºì²è¡¢¿¾ÕäÖéºì²è¡¢¿¾ÕäÖéâ¹ûÂ̲衢ҬÏãÅßÑ¿¿§·È¡¢½¹Ìǿɿɿ§·ÈµÈµÈ£¬Ã¿¼Òµê¶¼Óкܳ¤µÄ²Ëµ¥£¬µ«ÊÇ×Ðϸ¿´Ï£¬ÆäʵÔÁÏҲû¼¸Ñù£¬µ«ÊÇ¿ÉÒÔ´îÅä³öºÜ¶à×éºÏ£¬Èç¹û¹Ë¿ÍÐèÒª£¬ºÜ¶àû³öÏÖÔڲ˵¥ÖеÄÒûÁÏËûÃÇÒ²ÊÇ¿ÉÒÔ×öµÄ¡£
ÔÚÕâ¸öÀý×ÓÖУ¬ºì²è¡¢Â̲衢¿§·ÈÊÇ×î»ù´¡µÄÒûÁÏ£¬ÆäËûµÄÏñ½ð½ÛÄûÃÊ¡¢Ã¢¹û¡¢ÕäÖé¡¢Ò¬¹û¡¢½¹Ìǵȶ¼ÊôÓÚ×°ÊÎÓõġ£µ±È»£¬ÔÚ¿ª·¢ÖУ¬ÎÒÃÇȷʵ¿ÉÒÔÏñÃŵêÒ»Ñù£¬¿ª·¢ÕâЩÀࣺLemonBlackTea¡¢LemonGreenTea¡¢MangoBlackTea¡¢MangoLemonGreenTea¡¡µ«ÊÇ£¬ºÜ¿ìÎÒÃǾͷ¢ÏÖ£¬ÕâÑù×Ӹɿ϶¨ÊDz»Ðеģ¬Õâ»áµ¼ÖÂÎÒÃÇÐèÒª×éºÏ³öËùÓеĿÉÄÜ£¬¶øÇÒÈç¹û¿ÍÈËÐèÒªÔÚºì²èÖмÓË«·ÝÄûÃÊÔõô°ì£¿Èý·ÝÄûÃÊÔõô°ì£¿
²»Ëµ·Ï»°ÁË£¬ÉÏ´úÂë¡£
Ê×ÏÈ£¬¶¨ÒåÒûÁϳéÏó»ùÀࣺ
public abstract class Beverage {
// ·µ»ØÃèÊö
public abstract String getDescription();
// ·µ»Ø¼Û¸ñ
public abstract double cost();
} |
È»ºóÊÇÈý¸ö»ù´¡ÒûÁÏʵÏÖÀ࣬ºì²è¡¢Â̲èºÍ¿§·È£º
public class BlackTea extends Beverage {
public String getDescription() {
return "ºì²è";
}
public double cost() {
return 10;
}
}
public class GreenTea extends Beverage {
public String getDescription() {
return "Â̲è";
}
public double cost() {
return 11;
}
}
...// ¿§·ÈÊ¡ÂÔ |
¶¨Òåµ÷ÁÏ£¬Ò²¾ÍÊÇ×°ÊÎÕߵĻùÀ࣬´ËÀà±ØÐë¼Ì³Ð×Ô Beverage£º
// µ÷ÁÏ
public abstract class Condiment extends Beverage
{
} |
È»ºóÎÒÃÇÀ´¶¨ÒåÄûÃÊ¡¢Ã¢¹ûµÈ¾ßÌåµÄµ÷ÁÏ£¬ËüÃÇÊôÓÚ×°ÊÎÕߣ¬ºÁÎÞÒÉÎÊ£¬ÕâЩµ÷ÁϿ϶¨¶¼ÐèÒª¼Ì³Ðµ÷ÁÏ Condiment
Àࣺ
public class Lemon extends Condiment {
private Beverage bevarage;
// ÕâÀïºÜ¹Ø¼ü£¬ÐèÒª´«Èë¾ßÌåµÄÒûÁÏ£¬ÈçÐèÒª´«ÈëûÓб»×°Êεĺì²è»òÂ̲裬
// µ±È»Ò²¿ÉÒÔ´«ÈëÒѾװÊκõÄâ¹ûÂ̲裬ÕâÑù¿ÉÒÔ×öâ¹ûÄûÃÊÂ̲è
public Lemon(Beverage bevarage) {
this.bevarage = bevarage;
}
public String getDescription() {
// ×°ÊÎ
return bevarage.getDescription() + ", ¼ÓÄûÃÊ";
}
public double cost() {
// ×°ÊÎ
return beverage.cost() + 2; // ¼ÓÄûÃÊÐèÒª 2 Ôª
}
}
public class Mango extends Condiment {
private Beverage bevarage;
public Mango(Beverage bevarage) {
this.bevarage = bevarage;
}
public String getDescription() {
return bevarage.getDescription() + ", ¼Óâ¹û";
}
public double cost() {
return beverage.cost() + 3; // ¼Óâ¹ûÐèÒª 3 Ôª
}
}
...// ¸øÃ¿Ò»ÖÖµ÷Á϶¼¼ÓÒ»¸öÀà |
¿´¿Í»§¶Ëµ÷Óãº
public static void main(String[] args) {
// Ê×ÏÈ£¬ÎÒÃÇÐèÒªÒ»¸ö»ù´¡ÒûÁÏ£¬ºì²è¡¢Â̲è»ò¿§·È
Beverage beverage = new GreenTea();
// ¿ªÊ¼×°ÊÎ
beverage = new Lemon(beverage); // ÏȼÓÒ»·ÝÄûÃÊ
beverage = new Mongo(beverage); // ÔÙ¼ÓÒ»·Ýâ¹û
System.out.println(beverage.getDescription()
+ " ¼Û¸ñ£º£¤" + beverage.cost());
//"Â̲è, ¼ÓÄûÃÊ, ¼Óâ¹û ¼Û¸ñ£º£¤16"
} |
Èç¹ûÎÒÃÇÐèÒª â¹û-ÕäÖé-Ë«·ÝÄûÃÊ-ºì²è£º
Beverage beverage = new Mongo(new Pearl(new
Lemon(new Lemon(new BlackTea())))); |
ÊDz»ÊǺܱä̬£¿
¿´¿´ÏÂͼ¿ÉÄÜ»áÇåÎúһЩ£º

µ½ÕâÀ´ó¼ÒÓ¦¸ÃÒѾÇå³þ×°ÊÎģʽÁ˰ɡ£
ÏÂÃæ£¬ÎÒÃÇÔÙÀ´ËµËµ java IO ÖеÄ×°ÊÎģʽ¡£¿´ÏÂͼ InputStream ÅÉÉú³öÀ´µÄ²¿·ÖÀࣺ

ÎÒÃÇÖªµÀ InputStream ´ú±íÁËÊäÈëÁ÷£¬¾ßÌåµÄÊäÈëÀ´Ô´¿ÉÒÔÊÇÎļþ£¨FileInputStream£©¡¢¹ÜµÀ£¨PipedInputStream£©¡¢Êý×飨ByteArrayInputStream£©µÈ£¬ÕâЩ¾ÍÏñÇ°ÃæÄ̲èµÄÀý×ÓÖеĺì²è¡¢Â̲裬ÊôÓÚ»ù´¡ÊäÈëÁ÷¡£
FilterInputStream ³Ð½ÓÁË×°ÊÎģʽµÄ¹Ø¼ü½Úµã£¬ËüµÄʵÏÖÀàÊÇһϵÁÐ×°ÊÎÆ÷£¬±ÈÈç BufferedInputStream
´ú±íÓûº³åÀ´×°ÊΣ¬Ò²¾ÍʹµÃÊäÈëÁ÷¾ßÓÐÁË»º³åµÄ¹¦ÄÜ£¬LineNumberInputStream ´ú±íÓÃÐкÅÀ´×°ÊΣ¬ÔÚ²Ù×÷µÄʱºò¾Í¿ÉÒÔÈ¡µÃÐкÅÁË£¬DataInputStream
µÄ×°ÊΣ¬Ê¹µÃÎÒÃÇ¿ÉÒÔ´ÓÊäÈëÁ÷ת»»Îª java ÖеĻù±¾ÀàÐÍÖµ¡£
µ±È»£¬ÔÚ java IO ÖУ¬Èç¹ûÎÒÃÇʹÓÃ×°ÊÎÆ÷µÄ»°£¬¾Í²»Ì«ÊʺÏÃæÏò½Ó¿Ú±à³ÌÁË£¬È磺
InputStream inputStream = new LineNumberInputStream(new
BufferedInputStream(new FileInputStream(""))); |
ÕâÑùµÄ½á¹ûÊÇ£¬InputStream »¹ÊDz»¾ßÓжÁÈ¡ÐкŵŦÄÜ£¬ÒòΪ¶ÁÈ¡Ðкŵķ½·¨¶¨ÒåÔÚ LineNumberInputStream
ÀàÖС£
ÎÒÃÇÓ¦¸ÃÏñÏÂÃæÕâÑùʹÓãº
DataInputStream is = new DataInputStream(
new BufferedInputStream(
new FileInputStream(""))); |
ËùÒÔ˵ÂҪÕÒµ½´¿µÄÑϸñ·ûºÏÉè¼ÆÄ£Ê½µÄ´úÂ뻹ÊDZȽÏÄѵġ£
ÃÅÃæÄ£Ê½
ÃÅÃæÄ£Ê½£¨Ò²½ÐÍâ¹Ûģʽ£¬Facade Pattern£©ÔÚÐí¶àÔ´ÂëÖÐÓÐʹÓ㬱ÈÈç slf4j ¾Í¿ÉÒÔÀí½âΪÊÇÃÅÃæÄ£Ê½µÄÓ¦Óá£ÕâÊÇÒ»¸ö¼òµ¥µÄÉè¼ÆÄ£Ê½£¬ÎÒÃÇÖ±½ÓÉÏ´úÂëÔÙ˵°É¡£
Ê×ÏÈ£¬ÎÒÃǶ¨ÒåÒ»¸ö½Ó¿Ú£º
public interface Shape {
void draw();
} |
¶¨Ò弸¸öʵÏÖÀࣺ
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle::draw()");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle::draw()");
}
} |
¿Í»§¶Ëµ÷Óãº
public static void main(String[] args) {
// »Ò»¸öÔ²ÐÎ
Shape circle = new Circle();
circle.draw();
// »Ò»¸ö³¤·½ÐÎ
Shape rectangle = new Rectangle();
rectangle.draw();
} |
ÒÔÉÏÊÇÎÒÃdz£Ð´µÄ´úÂ룬ÎÒÃÇÐèÒª»Ô²¾ÍÒªÏÈʵÀý»¯Ô²£¬»³¤·½ÐξÍÐèÒªÏÈʵÀý»¯Ò»¸ö³¤·½ÐΣ¬È»ºóÔÙµ÷ÓÃÏàÓ¦µÄ
draw() ·½·¨¡£
ÏÂÃæ£¬ÎÒÃÇ¿´¿´ÔõôÓÃÃÅÃæÄ£Ê½À´Èÿͻ§¶Ëµ÷Óøü¼ÓÓѺÃһЩ¡£
ÎÒÃÇÏȶ¨ÒåÒ»¸öÃÅÃæ£º
public class ShapeMaker {
private Shape circle;
private Shape rectangle;
private Shape square;
public ShapeMaker() {
circle = new Circle();
rectangle = new Rectangle();
square = new Square();
}
/**
* ÏÂÃæ¶¨ÒåÒ»¶Ñ·½·¨£¬¾ßÌåÓ¦¸Ãµ÷ÓÃʲô·½·¨£¬ÓÉÕâ¸öÃÅÃæÀ´¾ö¶¨
*/
public void drawCircle(){
circle.draw();
}
public void drawRectangle(){
rectangle.draw();
}
public void drawSquare(){
square.draw();
}
} |
¿´¿´ÏÖÔÚ¿Í»§¶ËÔõôµ÷Óãº
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();
// ¿Í»§¶Ëµ÷ÓÃÏÖÔÚ¸ü¼ÓÇåÎúÁË
shapeMaker.drawCircle();
shapeMaker.drawRectangle();
shapeMaker.drawSquare();
} |
ÃÅÃæÄ£Ê½µÄÓŵãÏÔ¶øÒ×¼û£¬¿Í»§¶Ë²»ÔÙÐèÒª¹Ø×¢ÊµÀý»¯Ê±Ó¦¸ÃʹÓÃÄĸöʵÏÖÀֱ࣬½Óµ÷ÓÃÃÅÃæÌṩµÄ·½·¨¾Í¿ÉÒÔÁË£¬ÒòΪÃÅÃæÀàÌṩµÄ·½·¨µÄ·½·¨Ãû¶ÔÓÚ¿Í»§¶ËÀ´ËµÒѾºÜÓѺÃÁË¡£
×éºÏģʽ
×éºÏģʽÓÃÓÚ±íʾ¾ßÓвã´Î½á¹¹µÄÊý¾Ý£¬Ê¹µÃÎÒÃǶԵ¥¸ö¶ÔÏóºÍ×éºÏ¶ÔÏóµÄ·ÃÎʾßÓÐÒ»ÖÂÐÔ¡£
Ö±½Ó¿´Ò»¸öÀý×Ó°É£¬Ã¿¸öÔ±¹¤¶¼ÓÐÐÕÃû¡¢²¿ÃÅ¡¢Ð½Ë®ÕâЩÊôÐÔ£¬Í¬Ê±»¹ÓÐÏÂÊôÔ±¹¤¼¯ºÏ£¨ËäÈ»¿ÉÄܼ¯ºÏΪ¿Õ£©£¬¶øÏÂÊôÔ±¹¤ºÍ×Ô¼ºµÄ½á¹¹ÊÇÒ»ÑùµÄ£¬Ò²ÓÐÐÕÃû¡¢²¿ÃÅÕâЩÊôÐÔ£¬Í¬Ê±Ò²ÓÐËûÃǵÄÏÂÊôÔ±¹¤¼¯ºÏ¡£
public class Employee {
private String name;
private String dept;
private int salary;
private List<Employee> subordinates; //
ÏÂÊô
public Employee(String name,String dept, int
sal) {
this.name = name;
this.dept = dept;
this.salary = sal;
subordinates = new ArrayList<Employee>();
}
public void add(Employee e) {
subordinates.add(e);
}
public void remove(Employee e) {
subordinates.remove(e);
}
public List<Employee> getSubordinates(){
return subordinates;
}
public String toString(){
return ("Employee :[ Name : " + name
+ ", dept : " + dept + ", salary
:" + salary+" ]");
}
} |
ͨ³££¬ÕâÖÖÀàÐèÒª¶¨Òå add(node)¡¢remove(node)¡¢getChildren() ÕâЩ·½·¨¡£
Õâ˵µÄÆäʵ¾ÍÊÇ×éºÏģʽ£¬ÕâÖÖ¼òµ¥µÄģʽÎҾͲ»×ö¹ý¶à½éÉÜÁË£¬ÏàП÷λ¶ÁÕßÒ²²»Ï²»¶¿´ÎÒд·Ï»°¡£
ÏíԪģʽ
Ó¢ÎÄÊÇ Flyweight Pattern£¬²»ÖªµÀÊÇË×îÏÈ·ÒëµÄÕâ¸ö´Ê£¬¸Ð¾õÕâ·ÒëÕæµÄ²»ºÃÀí½â£¬ÎÒÃÇÊÔ×ÅÇ¿ÐйØÁªÆðÀ´°É¡£Flyweight
ÊÇÇáÁ¿¼¶µÄÒâ˼£¬ÏíÔª·Ö¿ªÀ´Ëµ¾ÍÊÇ ¹²Ïí ÔªÆ÷¼þ£¬Ò²¾ÍÊǸ´ÓÃÒѾÉú³ÉµÄ¶ÔÏó£¬ÕâÖÖ×ö·¨µ±È»Ò²¾ÍÊÇÇáÁ¿¼¶µÄÁË¡£
¸´ÓöÔÏó×î¼òµ¥µÄ·½Ê½ÊÇ£¬ÓÃÒ»¸ö HashMap À´´æ·Åÿ´ÎÐÂÉú³ÉµÄ¶ÔÏó¡£Ã¿´ÎÐèÒªÒ»¸ö¶ÔÏóµÄʱºò£¬Ïȵ½
HashMap Öп´¿´ÓÐûÓУ¬Èç¹ûûÓУ¬ÔÙÉú³ÉеĶÔÏó£¬È»ºó½«Õâ¸ö¶ÔÏó·ÅÈë HashMap ÖС£
ÕâÖÖ¼òµ¥µÄ´úÂëÎҾͲ»ÑÝʾÁË¡£
½á¹¹ÐÍģʽ×ܽá
Ç°Ãæ£¬ÎÒÃÇ˵ÁË´úÀíģʽ¡¢ÊÊÅäÆ÷ģʽ¡¢ÇÅÁºÄ£Ê½¡¢×°ÊÎģʽ¡¢ÃÅÃæÄ£Ê½¡¢×éºÏģʽºÍÏíԪģʽ¡£¶ÁÕßÊÇ·ñ¿ÉÒÔ·Ö±ð°ÑÕ⼸¸öģʽ˵Çå³þÁËÄØ£¿ÔÚ˵µ½ÕâЩģʽµÄʱºò£¬ÐÄÖÐÊÇ·ñÓÐÒ»¸öÇåÎúµÄͼ»ò´¦ÀíÁ÷³ÌÔÚÄÔº£ÀïÄØ£¿
´úÀíģʽÊÇ×ö·½·¨ÔöÇ¿µÄ£¬ÊÊÅäÆ÷ģʽÊǰѼ¦°ü×°³ÉѼÕâÖÖÓÃÀ´ÊÊÅä½Ó¿ÚµÄ£¬ÇÅÁºÄ£Ê½×öµ½Á˺ܺõĽâñװÊÎģʽ´ÓÃû×ÖÉϾͿ´µÃ³öÀ´£¬ÊʺÏÓÚ×°ÊÎÀà»òÕß˵ÊÇÔöÇ¿ÀàµÄ³¡¾°£¬ÃÅÃæÄ£Ê½µÄÓŵãÊǿͻ§¶Ë²»ÐèÒª¹ØÐÄʵÀý»¯¹ý³Ì£¬Ö»Òªµ÷ÓÃÐèÒªµÄ·½·¨¼´¿É£¬×éºÏģʽÓÃÓÚÃèÊö¾ßÓвã´Î½á¹¹µÄÊý¾Ý£¬ÏíԪģʽÊÇΪÁËÔÚÌØ¶¨µÄ³¡¾°Öлº´æÒѾ´´½¨µÄ¶ÔÏó£¬ÓÃÓÚÌá¸ßÐÔÄÜ¡£
ÐÐΪÐÍģʽ
ÐÐΪÐÍģʽ¹Ø×¢µÄÊǸ÷¸öÀàÖ®¼äµÄÏ໥×÷Ó㬽«Ö°Ôð»®·ÖÇå³þ£¬Ê¹µÃÎÒÃǵĴúÂë¸ü¼ÓµØÇåÎú¡£
²ßÂÔģʽ
²ßÂÔģʽ̫³£ÓÃÁË£¬ËùÒÔ°ÑËü·Åµ½×îÇ°Ãæ½øÐнéÉÜ¡£Ëü±È½Ï¼òµ¥£¬ÎҾͲ»·Ï»°£¬Ö±½ÓÓôúÂë˵ʰɡ£
ÏÂÃæÉè¼ÆµÄ³¡¾°ÊÇ£¬ÎÒÃÇÐèÒª»Ò»¸öͼÐΣ¬¿ÉÑ¡µÄ²ßÂÔ¾ÍÊÇÓúìÉ«±ÊÀ´»£¬»¹ÊÇÂÌÉ«±ÊÀ´»£¬»òÕßÀ¶É«±ÊÀ´»¡£
Ê×ÏÈ£¬Ïȶ¨ÒåÒ»¸ö²ßÂÔ½Ó¿Ú£º
public interface Strategy {
public void draw(int radius, int x, int y);
} |
È»ºóÎÒÃǶ¨Òå¾ßÌåµÄ¼¸¸ö²ßÂÔ£º
public class RedPen implements Strategy {
@Override
public void draw(int radius, int x, int y) {
System.out.println("ÓúìÉ«±Ê»Í¼£¬radius:"
+ radius + ", x:" + x + ", y:"
+ y);
}
}
public class GreenPen implements Strategy {
@Override
public void draw(int radius, int x, int y) {
System.out.println("ÓÃÂÌÉ«±Ê»Í¼£¬radius:"
+ radius + ", x:" + x + ", y:"
+ y);
}
}
public class BluePen implements Strategy {
@Override
public void draw(int radius, int x, int y) {
System.out.println("ÓÃÀ¶É«±Ê»Í¼£¬radius:"
+ radius + ", x:" + x + ", y:"
+ y);
}
} |
ʹÓòßÂÔµÄÀࣺ
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeDraw(int radius, int x,
int y){
return strategy.draw(radius, x, y);
}
} |
¿Í»§¶ËÑÝʾ£º
public static void main(String[] args) {
Context context = new Context(new BluePen());
// ʹÓÃÂÌÉ«±ÊÀ´»
context.executeDraw(10, 0, 0);
} |
·Åµ½Ò»ÕÅͼÉÏ£¬Èôó¼Ò¿´µÃÇåÎúЩ£º

Õâ¸öʱºò£¬´ó¼ÒÓÐûÓÐÁªÏëµ½½á¹¹ÐÍģʽÖеÄÇÅÁºÄ£Ê½£¬ËüÃÇÆäʵ·Ç³£ÏàËÆ£¬ÎÒ°ÑÇÅÁºÄ£Ê½µÄͼÄùýÀ´´ó¼Ò¶Ô±ÈÏ£º

ÒªÎÒ˵µÄ»°£¬ËüÃǷdz£ÏàËÆ£¬ÇÅÁºÄ£Ê½ÔÚ×ó²à¼ÓÁËÒ»²ã³éÏó¶øÒÑ¡£ÇÅÁºÄ£Ê½µÄñîºÏ¸üµÍ£¬½á¹¹¸ü¸´ÔÓһЩ¡£
¹Û²ìÕßģʽ
¹Û²ìÕßģʽ¶ÔÓÚÎÒÃÇÀ´Ëµ£¬ÕæÊÇÔÙ¼òµ¥²»¹ýÁË¡£ÎÞÍâºõÁ½¸ö²Ù×÷£¬¹Û²ìÕß¶©ÔÄ×Ô¼º¹ØÐĵÄÖ÷ÌâºÍÖ÷ÌâÓÐÊý¾Ý±ä»¯ºó֪ͨ¹Û²ìÕßÃÇ¡£
Ê×ÏÈ£¬ÐèÒª¶¨ÒåÖ÷Ì⣬ÿ¸öÖ÷ÌâÐèÒª³ÖÓй۲ìÕßÁбíµÄÒýÓã¬ÓÃÓÚÔÚÊý¾Ý±ä¸üµÄʱºò֪ͨ¸÷¸ö¹Û²ìÕߣº
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
// Êý¾ÝÒѱä¸ü£¬Í¨Öª¹Û²ìÕßÃÇ
notifyAllObservers();
}
// ×¢²á¹Û²ìÕß
public void attach(Observer observer) {
observers.add(observer);
}
// ֪ͨ¹Û²ìÕßÃÇ
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update();
}
}
} |
¶¨Òå¹Û²ìÕß½Ó¿Ú£º
public abstract class Observer {
protected Subject subject;
public abstract void update();
} |
ÆäʵÈç¹ûÖ»ÓÐÒ»¸ö¹Û²ìÕßÀàµÄ»°£¬½Ó¿Ú¶¼²»Óö¨ÒåÁË£¬²»¹ý£¬Í¨³£³¡¾°Ï£¬¼ÈÈ»Óõ½Á˹۲ìÕßģʽ£¬ÎÒÃǾÍÊÇÏ£ÍûÒ»¸öʼþ³öÀ´ÁË£¬»áÓжà¸ö²»Í¬µÄÀàÐèÒª´¦ÀíÏàÓ¦µÄÐÅÏ¢¡£±ÈÈ磬¶©µ¥Ð޸ijɹ¦Ê¼þ£¬ÎÒÃÇÏ£Íû·¢¶ÌÐŵÄÀàµÃµ½Í¨Öª¡¢·¢ÓʼþµÄÀàµÃµ½Í¨Öª¡¢´¦ÀíÎïÁ÷ÐÅÏ¢µÄÀàµÃµ½Í¨ÖªµÈ¡£
ÎÒÃÇÀ´¶¨Òå¾ßÌåµÄ¼¸¸ö¹Û²ìÕßÀࣺ
public class BinaryObserver extends Observer
{
// ÔÚ¹¹Ôì·½·¨ÖнøÐж©ÔÄÖ÷Ìâ
public BinaryObserver(Subject subject) {
this.subject = subject;
// ͨ³£ÔÚ¹¹Ôì·½·¨Öн« this ·¢²¼³öÈ¥µÄ²Ù×÷Ò»¶¨ÒªÐ¡ÐÄ
this.subject.attach(this);
}
// ¸Ã·½·¨ÓÉÖ÷ÌâÀàÔÚÊý¾Ý±ä¸üµÄʱºò½øÐе÷ÓÃ
@Override
public void update() {
String result = Integer.toBinaryString(subject.getState());
System.out.println("¶©ÔĵÄÊý¾Ý·¢Éú±ä»¯£¬ÐµÄÊý¾Ý´¦ÀíΪ¶þ½øÖÆÖµÎª£º"
+ result);
}
}
public class HexaObserver extends Observer
{
public HexaObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
String result = Integer.toHexString(subject.getState()).toUpperCase();
System.out.println("¶©ÔĵÄÊý¾Ý·¢Éú±ä»¯£¬ÐµÄÊý¾Ý´¦ÀíΪʮÁù½øÖÆÖµÎª£º"
+ result);
}
} |
¿Í»§¶ËʹÓÃÒ²·Ç³£¼òµ¥£º
public static void main(String[] args) {
// Ïȶ¨ÒåÒ»¸öÖ÷Ìâ
Subject subject1 = new Subject();
// ¶¨Òå¹Û²ìÕß
new BinaryObserver(subject1);
new HexaObserver(subject1);
// Ä£ÄâÊý¾Ý±ä¸ü£¬Õâ¸öʱºò£¬¹Û²ìÕßÃÇµÄ update ·½·¨½«»á±»µ÷ÓÃ
subject.setState(11);
} |
output:
¶©ÔĵÄÊý¾Ý·¢Éú±ä»¯£¬ÐµÄÊý¾Ý´¦ÀíΪ¶þ½øÖÆÖµÎª£º1011
¶©ÔĵÄÊý¾Ý·¢Éú±ä»¯£¬ÐµÄÊý¾Ý´¦ÀíΪʮÁù½øÖÆÖµÎª£ºB |
µ±È»£¬jdk Ò²ÌṩÁËÏàËÆµÄÖ§³Ö£¬¾ßÌåµÄ´ó¼Ò¿ÉÒԲο¼ java.util.Observable ºÍ
java.util.Observer ÕâÁ½¸öÀà¡£
ʵ¼ÊÉú²ú¹ý³ÌÖУ¬¹Û²ìÕßģʽÍùÍùÓÃÏûÏ¢Öмä¼þÀ´ÊµÏÖ£¬Èç¹ûҪʵÏÖµ¥»ú¹Û²ìÕßģʽ£¬±ÊÕß½¨Òé¶ÁÕßʹÓà Guava
ÖÐµÄ EventBus£¬ËüÓÐͬ²½ÊµÏÖÒ²ÓÐÒ첽ʵÏÖ£¬±¾ÎÄÖ÷Òª½éÉÜÉè¼ÆÄ£Ê½£¬¾Í²»Õ¹¿ªËµÁË¡£
»¹ÓУ¬¼´Ê¹ÊÇÉÏÃæµÄÕâ¸ö´úÂ룬Ҳ»áÓкܶà±äÖÖ£¬´ó¼ÒÖ»Òª¼ÇסºËÐĵIJ¿·Ö£¬ÄǾÍÊÇÒ»¶¨ÓÐÒ»¸öµØ·½´æ·ÅÁËËùÓеĹ۲ìÕߣ¬È»ºóÔÚʼþ·¢ÉúµÄʱºò£¬±éÀú¹Û²ìÕߣ¬µ÷ÓÃËüÃǵĻص÷º¯Êý¡£
ÔðÈÎÁ´Ä£Ê½
ÔðÈÎÁ´Í¨³£ÐèÒªÏȽ¨Á¢Ò»¸öµ¥ÏòÁ´±í£¬È»ºóµ÷Ó÷½Ö»ÐèÒªµ÷ÓÃÍ·²¿½Úµã¾Í¿ÉÒÔÁË£¬ºóÃæ»á×Ô¶¯Á÷תÏÂÈ¥¡£±ÈÈçÁ÷³ÌÉóÅú¾ÍÊÇÒ»¸öºÜºÃµÄÀý×Ó£¬Ö»ÒªÖÕ¶ËÓû§Ìá½»ÉêÇ룬¸ù¾ÝÉêÇëµÄÄÚÈÝÐÅÏ¢£¬×Ô¶¯½¨Á¢Ò»ÌõÔðÈÎÁ´£¬È»ºó¾Í¿ÉÒÔ¿ªÊ¼Á÷תÁË¡£
ÓÐÕâôһ¸ö³¡¾°£¬Óû§²Î¼ÓÒ»¸ö»î¶¯¿ÉÒÔÁìÈ¡½±Æ·£¬µ«ÊǻÐèÒª½øÐкܶàµÄ¹æÔòУÑéÈ»ºó²ÅÄÜ·ÅÐУ¬±ÈÈçÊ×ÏÈÐèҪУÑéÓû§ÊÇ·ñÊÇÐÂÓû§¡¢½ñÈÕ²ÎÓëÈËÊýÊÇ·ñÓÐÏ޶ȫ³¡²ÎÓëÈËÊýÊÇ·ñÓÐÏÞ¶îµÈµÈ¡£É趨µÄ¹æÔò¶¼Í¨¹ýºó£¬²ÅÄÜÈÃÓû§Áì×ß½±Æ·¡£
Èç¹û²úÆ·¸øÄãÕâ¸öÐèÇóµÄ»°£¬ÎÒÏë´ó²¿·ÖÈËÒ»¿ªÊ¼¿Ï¶¨ÏëµÄ¾ÍÊÇ£¬ÓÃÒ»¸ö List À´´æ·ÅËùÓеĹæÔò£¬È»ºó
foreach Ö´ÐÐÒ»ÏÂÿ¸ö¹æÔò¾ÍºÃÁË¡£²»¹ý£¬¶ÁÕßÒ²Ïȱ𼱣¬¿´¿´ÔðÈÎÁ´Ä£Ê½ºÍÎÒÃÇ˵µÄÕâ¸öÓÐʲô²»Ò»Ñù£¿
Ê×ÏÈ£¬ÎÒÃÇÒª¶¨ÒåÁ÷³ÌÉϽڵãµÄ»ùÀࣺ
public abstract
class RuleHandler {
// ºó¼Ì½Úµã
protected RuleHandler successor;
public abstract void apply(Context context);
public void setSuccessor(RuleHandler successor)
{
this.successor = successor;
}
public RuleHandler getSuccessor() {
return successor;
}
} |
½ÓÏÂÀ´£¬ÎÒÃÇÐèÒª¶¨Òå¾ßÌåµÄÿ¸ö½ÚµãÁË¡£
УÑéÓû§ÊÇ·ñÊÇÐÂÓû§£º
public class NewUserRuleHandler extends RuleHandler
{
public void apply(Context context) {
if (context.isNewUser()) {
// Èç¹ûÓкó¼Ì½ÚµãµÄ»°£¬´«µÝÏÂÈ¥
if (this.getSuccessor() != null) {
this.getSuccessor().apply(context);
}
} else {
throw new RuntimeException("¸Ã»î¶¯½öÏÞÐÂÓû§²ÎÓë");
}
}
} |
УÑéÓû§ËùÔÚµØÇøÊÇ·ñ¿ÉÒÔ²ÎÓ룺
public class LocationRuleHandler extends RuleHandler
{
public void apply(Context context) {
boolean allowed = activityService.isSupportedLocation(context.getLocation);
if (allowed) {
if (this.getSuccessor() != null) {
this.getSuccessor().apply(context);
}
} else {
throw new RuntimeException("·Ç³£±§Ç¸£¬ÄúËùÔڵĵØÇøÎÞ·¨²ÎÓë±¾´Î»î¶¯");
}
}
} |
УÑ齱ƷÊÇ·ñÒÑÁìÍ꣺
public class LimitRuleHandler extends RuleHandler
{
public void apply(Context context) {
int remainedTimes = activityService.queryRemainedTimes(context);
// ²éѯʣÓཱƷ
if (remainedTimes > 0) {
if (this.getSuccessor() != null) {
this.getSuccessor().apply(userInfo);
}
} else {
throw new RuntimeException("ÄúÀ´µÃÌ«ÍíÁË£¬½±Æ·±»ÁìÍêÁË");
}
}
} |
¿Í»§¶Ë£º
public static void main(String[] args) {
RuleHandler newUserHandler = new NewUserRuleHandler();
RuleHandler locationHandler = new LocationRuleHandler();
RuleHandler limitHandler = new LimitRuleHandler();
// ¼ÙÉè±¾´Î»î¶¯½öУÑéµØÇøºÍ½±Æ·ÊýÁ¿£¬²»Ð£ÑéÐÂÀÏÓû§
locationHandler.setSuccessor(limitHandler);
locationHandler.apply(context);
} |
´úÂëÆäʵºÜ¼òµ¥£¬¾ÍÊÇÏȶ¨ÒåºÃÒ»¸öÁ´±í£¬È»ºóÔÚͨ¹ýÈÎÒâÒ»½Úµãºó£¬Èç¹û´Ë½ÚµãÓкó¼Ì½Úµã£¬ÄÇô´«µÝÏÂÈ¥¡£
ÖÁÓÚËüºÍÎÒÃÇÇ°ÃæËµµÄÓÃÒ»¸ö List ´æ·ÅÐèÒªÖ´ÐеĹæÔòµÄ×ö·¨ÓÐʲôÒìͬ£¬Áô¸ø¶ÁÕß×Ô¼º×ÁÄ¥°É¡£
Ä£°å·½·¨Ä£Ê½
ÔÚº¬Óм̳нṹµÄ´úÂëÖУ¬Ä£°å·½·¨Ä£Ê½ÊǷdz£³£Óõġ£
ͨ³£»áÓÐÒ»¸ö³éÏóÀࣺ
public abstract class AbstractTemplate {
// Õâ¾ÍÊÇÄ£°å·½·¨
public void templateMethod() {
init();
apply(); // Õâ¸öÊÇÖØµã
end(); // ¿ÉÒÔ×÷Ϊ¹³×Ó·½·¨
}
protected void init() {
System.out.println("init ³éÏó²ãÒѾʵÏÖ£¬×ÓÀàÒ²¿ÉÒÔÑ¡Ôñ¸²Ð´");
}
// Áô¸ø×ÓÀàʵÏÖ
protected abstract void apply();
protected void end() {
}
} |
Ä£°å·½·¨Öе÷ÓÃÁË 3 ¸ö·½·¨£¬ÆäÖÐ apply() ÊdzéÏó·½·¨£¬×ÓÀà±ØÐëʵÏÖËü£¬Æäʵģ°å·½·¨ÖÐÓм¸¸ö³éÏó·½·¨ÍêÈ«ÊÇ×ÔÓɵģ¬ÎÒÃÇÒ²¿ÉÒÔ½«Èý¸ö·½·¨¶¼ÉèÖÃΪ³éÏó·½·¨£¬ÈÃ×ÓÀàÀ´ÊµÏÖ¡£Ò²¾ÍÊÇ˵£¬Ä£°å·½·¨Ö»¸ºÔð¶¨ÒåµÚÒ»²½Ó¦¸ÃÒª×öʲô£¬µÚ¶þ²½Ó¦¸Ã×öʲô£¬µÚÈý²½Ó¦¸Ã×öʲô£¬ÖÁÓÚÔõô×ö£¬ÓÉ×ÓÀàÀ´ÊµÏÖ¡£
ÎÒÃÇдһ¸öʵÏÖÀࣺ
public class ConcreteTemplate extends AbstractTemplate
{
public void apply() {
System.out.println("×ÓÀàʵÏÖ³éÏó·½·¨ apply");
}
public void end() {
System.out.println("ÎÒÃÇ¿ÉÒÔ°Ñ method3 µ±×ö¹³×Ó·½·¨À´Ê¹Óã¬ÐèÒªµÄʱºò¸²Ð´¾Í¿ÉÒÔÁË");
}
} |
¿Í»§¶Ëµ÷ÓÃÑÝʾ£º
public static void main(String[] args) {
AbstractTemplate t = new ConcreteTemplate();
// µ÷ÓÃÄ£°å·½·¨
t.templateMethod();
} |
´úÂëÆäʵºÜ¼òµ¥£¬»ù±¾ÉÏ¿´µ½¾Í¶®ÁË£¬¹Ø¼üÊÇҪѧ»áÓõ½×Ô¼ºµÄ´úÂëÖС£
״̬ģʽ
·Ï»°ÎҾͲ»ËµÁË£¬ÎÒÃÇ˵һ¸ö¼òµ¥µÄÀý×Ó¡£ÉÌÆ·¿â´æÖÐÐÄÓиö×î»ù±¾µÄÐèÇóÊǼõ¿â´æºÍ²¹¿â´æ£¬ÎÒÃÇ¿´¿´ÔõôÓÃ״̬ģʽÀ´Ð´¡£
ºËÐÄÔÚÓÚ£¬ÎÒÃǵĹØ×¢µã²»ÔÙÊÇ Context ÊǸýøÐÐÄÄÖÖ²Ù×÷£¬¶øÊǹØ×¢ÔÚÕâ¸ö Context »áÓÐÄÄЩ²Ù×÷¡£
¶¨Òå״̬½Ó¿Ú£º
public interface State {
public void doAction(Context context);
} |
¶¨Òå¼õ¿â´æµÄ״̬£º
public class DeductState implements State {
public void doAction(Context context) {
System.out.println("ÉÌÆ·Âô³ö£¬×¼±¸¼õ¿â´æ");
context.setState(this);
//... Ö´Ðмõ¿â´æµÄ¾ßÌå²Ù×÷
}
public String toString() {
return "Deduct State";
}
} |
¶¨Òå²¹¿â´æ×´Ì¬£º
public class RevertState implements State {
public void doAction(Context context) {
System.out.println("¸ø´ËÉÌÆ·²¹¿â´æ");
context.setState(this);
//... Ö´ÐÐ¼Ó¿â´æµÄ¾ßÌå²Ù×÷
}
public String toString() {
return "Revert State";
}
} |
Ç°ÃæÓõ½ÁË context.setState(this)£¬ÎÒÃÇÀ´¿´¿´Ôõô¶¨Òå Context Àࣺ
public class Context {
private State state;
private String name;
public Context(String name) {
this.name = name;
}
public void setState(State state) {
this.state = state;
}
public void getState() {
return this.state;
}
} |
ÎÒÃÇÀ´¿´Ï¿ͻ§¶Ëµ÷Ó㬴ó¼Ò¾ÍÒ»Çå¶þ³þÁË£º
public static void main(String[] args) {
// ÎÒÃÇÐèÒª²Ù×÷µÄÊÇ iPhone X
Context context = new Context("iPhone X");
// ¿´¿´Ôõô½øÐв¹¿â´æ²Ù×÷
State revertState = new RevertState();
revertState.doAction(context);
// ͬÑùµÄ£¬¼õ¿â´æ²Ù×÷Ò²·Ç³£¼òµ¥
State deductState = new DeductState();
deductState.doAction(context);
// Èç¹ûÐèÒªÎÒÃÇ¿ÉÒÔ»ñÈ¡µ±Ç°µÄ״̬
// context.getState().toString();
} |
¶ÁÕß¿ÉÄܻᷢÏÖ£¬ÔÚÉÏÃæÕâ¸öÀý×ÓÖУ¬Èç¹ûÎÒÃDz»¹ØÐĵ±Ç° context ´¦ÓÚʲô״̬£¬ÄÇô Context
¾Í¿ÉÒÔ²»ÓÃά»¤ state ÊôÐÔÁË£¬ÄÇÑù´úÂë»á¼òµ¥ºÜ¶à¡£
²»¹ý£¬ÉÌÆ·¿â´æÕâ¸öÀý×ӱϾ¹Ö»ÊǸöÀý£¬ÎÒÃÇ»¹ÓкܶàʵÀýÊÇÐèÒªÖªµÀµ±Ç° context ´¦ÓÚʲô״̬µÄ¡£
ÐÐΪÐÍģʽ×ܽá
ÐÐΪÐÍģʽ²¿·Ö½éÉÜÁ˲ßÂÔģʽ¡¢¹Û²ìÕßģʽ¡¢ÔðÈÎÁ´Ä£Ê½¡¢Ä£°å·½·¨Ä£Ê½ºÍ״̬ģʽ£¬Æäʵ£¬¾µäµÄÐÐΪÐÍģʽ»¹°üÀ¨±¸Íü¼ģʽ¡¢ÃüÁîģʽµÈ£¬µ«ÊÇËüÃǵÄʹÓó¡¾°±È½ÏÓÐÏÞ£¬¶øÇÒ±¾ÎÄÆª·ùҲͦ´óÁË£¬ÎҾͲ»½øÐнéÉÜÁË¡£
×ܽá
ѧϰÉè¼ÆÄ£Ê½µÄÄ¿µÄÊÇΪÁËÈÃÎÒÃǵĴúÂë¸ü¼ÓµÄÓÅÑÅ¡¢Ò×ά»¤¡¢Ò×À©Õ¹¡£Õâ´ÎÕûÀíÕâÆªÎÄÕ£¬ÈÃÎÒÖØÐÂÉóÊÓÁËһϸ÷¸öÉè¼ÆÄ£Ê½£¬¶ÔÎÒ×Ô¼º¶øÑÔÊÕ»ñ»¹ÊÇͦ´óµÄ¡£ÎÒÏ룬ÎÄÕµÄ×î´óÊÕÒæÕßÒ»°ã¶¼ÊÇ×÷Õß±¾ÈË£¬ÎªÁËдһƪÎÄÕ£¬ÐèÒª¹®¹Ì×Ô¼ºµÄ֪ʶ£¬ÐèҪѰÕÒ¸÷ÖÖ×ÊÁÏ£¬¶øÇÒ£¬×Ô¼ºÐ´¹ýµÄ²Å×îÈÝÒ×¼Çס£¬Ò²ËãÊÇÎÒ¸ø¶ÁÕߵĽ¨Òé°É¡£ |