鍐欏湪鍓嶉潰锛岃褰曞涔犺璁℃ā寮忕殑绗旇锛屾彁楂樿璁℃ā寮忕殑鐏垫椿杩愮敤瀛︿範鍦板潃https://www.bilibili.com/video...https://www.bilibili.com/video...鍙傝€冩枃绔爃ttp://c.biancheng.net/view/1...椤圭洰婧愮爜https://gitee.com/zhuang-kang/DesignPattern21銆佽瀵熻€呮ā寮?1.1瑙傚療鑰呮ā寮忕殑瀹氫箟鍙婄壒鐐硅瀵熻€咃紙Observer锛夋ā寮忕殑瀹氫箟锛氭槸鎸囧涓璞′箣闂村瓨鍦ㄤ竴瀵瑰鐨勪緷璧栧叧绯汇€傚綋涓€涓璞$殑鐘舵€佸彂鐢熷彉鍖栨椂锛屾墍鏈変緷璧栧畠鐨勫璞¢兘浼氭敹鍒伴€氱煡骞惰嚜鍔ㄦ洿鏂般€傝繖绉嶆ā寮忔湁鏃朵篃绉颁负鍙戝竷-璁㈤槄妯″紡銆佹ā鍨?瑙嗗浘妯″紡锛屾槸涓€绉嶅璞¤涓烘ā寮忋€傝瀵熻€呮ā寮忔槸涓€绉嶅璞¤涓烘ā寮忥紝鍏朵富瑕佷紭鐐瑰涓嬨€傞檷浣庝簡鐩爣鍜岃瀵熻€呬箣闂寸殑鑰﹀悎鍏崇郴锛屼袱鑰呬箣闂村瓨鍦ㄦ娊璞$殑鑰﹀悎鍏崇郴銆傜鍚堜緷璧栧€掔疆鍘熷垯銆傚湪鐩爣鍜岃瀵熻€呬箣闂村缓绔嬩簡瑙﹀彂鏈哄埗銆傚畠鐨勪富瑕佺己鐐瑰涓嬨€傜洰鏍囧拰瑙傚療鑰呬箣闂寸殑渚濊禆鍏崇郴娌℃湁瀹屽叏瑙e喅锛屽彲鑳藉瓨鍦ㄥ惊鐜紩鐢ㄣ€傚綋瑙傚療鑰呭璞¤緝澶氭椂锛岄€氱煡鐨勫彂甯冧細鑰楄垂澶ч噺鏃堕棿锛屽奖鍝嶇▼搴忔晥鐜囥€?1.2瑙傚療鑰呮ā寮忕殑缁撴瀯涓庡疄鐜板湪瀹炵幇瑙傚療鑰呮ā寮忔椂闇€瑕佹敞鎰忕殑鏄紝鍏蜂綋鐨勭洰鏍囧璞″拰鍏蜂綋鐨勮瀵熻€呭璞′笉鑳界洿鎺ヨ皟鐢紝鍚﹀垯涓よ€呬細绱ц€﹀悎锛岃繚鍙嶄簡闈㈠悜瀵硅薄鐨勮璁″師鍒?1.2.1瑙傚療鑰呮ā寮忕殑缁撴瀯鎶借薄涓婚锛圫ubject锛変綔鐢細涔熷彨鎶借薄鐩爣绫伙紝瀹冩彁渚涗簡涓€涓繚瀛樿瀵熻€呭璞$殑鑱氬悎绫诲拰澧炲垹瑙傚療鑰呭璞$殑鏂规硶锛屼互鍙婁竴涓€氱煡鎵€鏈夎瀵熻€呯殑鎶借薄鏂规硶銆傚叿浣撲富浣撹鑹诧細涔熷彨鍏蜂綋鐩爣绫伙紝瀹炵幇浜嗘娊璞$洰鏍囦腑鐨勯€氱煡鏂规硶锛屽綋鍏蜂綋涓讳綋鍐呴儴鐘舵€佸彂鐢熷彉鍖栨椂锛岄€氱煡鎵€鏈夋敞鍐岀殑瑙傚療鑰呭璞°€傛娊璞¤瀵熻€咃紙Observer锛夎鑹诧細鏄竴涓娊璞$被鎴栨帴鍙o紝鍖呭惈涓€涓洿鏂拌嚜韬殑鎶借薄鏂规硶锛屽綋鏀跺埌鐗瑰畾涓婚鐨勫彉鍖栭€氱煡鏃惰皟鐢ㄣ€侰oncreteObserver瑙掕壊锛氬疄鐜癆bstractObserver涓畾涔夌殑鎶借薄鏂规硶锛屼互鍦ㄦ敹鍒扮洰鏍囨洿鏀归€氱煡鏃舵洿鏂拌嚜宸辩殑鐘舵€併€?1.2.1浠g爜瀹炵幇鍦ㄤ娇鐢ㄥ井淇″叕浼楀彿鐨勬椂鍊欙紝澶у閮戒細鏈夎繖鏍风殑缁忓巻銆傚綋鎮ㄥ叧娉ㄧ殑鍏紬鍙锋湁鏂扮殑鍐呭鏇存柊鏃讹紝浼氭帹閫佺粰鍏虫敞鍏紬鍙风殑寰俊瀹㈡埛绔€傛垜浠娇鐢ㄨ瀵熻€呮ā寮忔潵妯℃嫙杩欐牱鐨勫満鏅€傚井淇$敤鎴锋槸瑙傚療鑰咃紝寰俊鍏紬鍙锋槸琚瀵熻€呫€傛湁澶氫釜寰俊鐢ㄦ埛鍏虫敞绋嬪簭鐚跨殑鍏紬鍙峰叧绯荤被鍥俱€傝瀵熻€呭寘com.zhuang.observer;/***@ClassnameObserver*@DescriptionAbstractobserver*@Date2021/3/2814:14*@Createdbydell*/publicinterfaceObserver{//鏇存柊鏂规硶voidupdate(Stringmessages);}WexinUserpackagecom.zhuang.observer;/***@ClassnameWexinUser*@Description鍏蜂綋鐨勮瀵熻€呯被瀹炵幇鏇存柊鏂规硶*@Date2021/3/2814:14*@Createdbydell*/publicclassWexinUserimplementsObserver{//UserprivateStringname;publicWexinUser(Stringname){this.name=name;}publicWexinUser(){}@Overridepublicvoidupdate(Stringmessages){System.out.println(name+"-->"+messages);}}Subjectpackagecom.zhuang.observer;/***@ClassnameSubject*@Description鎶借薄涓婚绫?@Date2021/3/2814:15*@Createdbydell*/publicinterfaceSubject{//娣诲姞璁㈤槄Subscriberpublic鏃犳晥闄勫姞锛堣瀵熻€呰瀵熻€咃級锛?/鍒犻櫎璁㈤槄鑰卲ublicvoidremove(Observerobserver);//閫氱煡璁㈤槄鑰呮洿鏂版秷鎭痯ublicvoidnotify(Stringmessages);}SubscriptionSubjectpackagecom.zhuang.observer;importjava.util.ArrayList;importjava.util.List;/***@ClassnameSubscriptionSubject*@Description瀹炰綋涓婚(瀹炰綋琚瀵熻€?*@Date2021/3/2814:15*@Createdbydell*/publicclassSubscriptionSubjectimplementsSubject{//瀛樺偍璁㈤槄鍏紬鍙风殑寰俊鐢ㄦ埛privateListweixinUserList=newArrayList();@Overridepublicvoidattach(Observerobserver){weixinUserList.add(observer);}@Overridepublicvoidremove(Observerobserver){weixinUserList.remove(observer);}@Overridepublicvoidnotify(Stringmessages){for(Observerobserver:weixinUserList){observer.update(messages);}}}Clientpackagecom.zhuang.observer;/***@ClassnameClient*@Description瑙傚療鑰呮ā鍨嬫祴璇曠被*@Date2021/3/2814:16*@Createdbydell*/publicclassClient{publicstaticvoidmain(String[]args){瀛恠criptSubject涓婚=newSubscriptionSubject();//鍒涘缓寰俊鐢ㄦ埛WexinUseruser1=newWexinUser("寮犱笁");WexinUseruser2=newWexinUser("鏉庡洓");WexinUseruser3=newWexinUser("鐜嬭垶");//璁㈤槄鍏紬鍙穝ubject.attach(user1);subject.attach(user2);subject.attach(user3);//閫氳繃璁㈤槄鐢ㄦ埛subject.notify("浣犲叧娉ㄧ殑鍏紬鍙锋洿鏂颁簡~~~");}}20.3瑙傚療鑰呮ā寮忕殑搴旂敤鍦烘櫙涓璞′箣闂村瓨鍦ㄤ竴瀵瑰鐨勫叧绯汇€備竴涓璞$殑鐘舵€佹敼鍙樹細褰卞搷鍏朵粬瀵硅薄銆傚綋涓€涓娊璞℃ā鍨嬫湁涓や釜鏂归潰锛屽叾涓竴涓緷璧栦簬鍙︿竴涓椂锛屽彲浠ュ皢涓よ€呯粍鍚堝皝瑁呭湪鍗曠嫭鐨勫璞′腑锛屼互渚垮畠浠彲浠ョ浉浜掔嫭绔嬪湴鏇存敼鍜岄噸鐢ㄣ€傚疄鐜颁竴涓被浼间簬骞挎挱鏈哄埗鐨勫姛鑳斤紝涓嶉渶瑕佺煡閬撳叿浣撶殑鐩戝惉鑰咃紝鍙渶瑕佸垎鍙戝箍鎾紝绯荤粺涓劅鍏磋叮鐨勫璞″氨浼氳嚜鍔ㄦ帴鏀跺埌骞挎挱銆傚灞傚祵濂楀舰鎴愰摼寮忚Е鍙戞満鍒讹紝浣垮緱浜嬩欢鍙互璺ㄥ煙锛堣法涓ょ被瑙傚療鑰咃級寰楀埌閫氱煡銆?0.4JDK婧愮爜鍒嗘瀽鍦↗ava涓紝瑙傚療鑰呮ā寮忔槸閫氳繃java.util.Observable绫诲拰java.util.Observer鎺ュ彛鏉ュ畾涔夌殑銆傚彧瑕佸疄鐜颁簡瀹冧滑鐨勫瓙绫伙紝灏卞彲浠ョ紪鍐欒瀵熻€呮ā寮忕殑瀹炰緥銆?.Observable绫籓bservable绫绘槸涓€涓娊璞$殑鐩爣绫伙紙observed锛夈€傚畠鏈変竴涓猇ector闆嗗悎鎴愬憳鍙橀噺锛岀敤浜庝繚瀛樻墍鏈夐渶瑕侀€氱煡鐨勮瀵熻€呭璞°€備笅闈粙缁嶄竴涓嬪畠鏈€閲嶈鐨勪笁涓柟娉曘€倂oidaddObserver(Observero)鏂规硶锛氱敤浜庡悜闆嗗悎涓坊鍔犱竴涓柊鐨勮瀵熻€呭璞°€倂oidnotifyObservers(Objectarg)鏂规硶锛氳皟鐢ㄩ泦鍚堜腑鎵€鏈夎瀵熻€呭璞$殑update鏂规硶锛岄€氱煡瀹冧滑鏁版嵁鍙樺寲銆傞€氬父杈冩櫄鍔犲叆闆嗗悎鐨勮瀵熻€呬細杈冩棭鏀跺埌閫氱煡銆倂oidsetChange()鏂规硶锛氱敤浜庤缃竴涓猙oolean绫诲瀷鐨勫唴閮ㄦ爣蹇楋紝琛ㄧず鐩爣瀵硅薄鍙戠敓浜嗗彉鍖栥€俷otifyObservers()鍙細鍦ㄤ负鐪熸椂閫氱煡瑙傚療鑰呫€?.Observer鎺ュ彛Observer鎺ュ彛鏄竴涓娊璞$殑瑙傚療鑰咃紝瀹冪洃瑙嗙潃鐩爣瀵硅薄鐨勫彉鍖栥€傚綋鐩爣瀵硅薄鍙戠敓鍙樺寲鏃讹紝閫氱煡瑙傚療鑰呭苟璋冪敤update鏂规硶杩涜鐩稿簲鐨勫伐浣溿€傘€愪緥銆戣瀵熸姄灏忓伔銆傝瀵熸姄灏忓伔涔熷彲浠ラ€氳繃瑙傚療鑰呮ā寮忓疄鐜般€傝瀵熸槸瑙傚療鑰咃紝灏忓伔鏄瑙傚療鑰呫€備唬鐮佸涓嬶細灏忓伔鏄瀵熻€咃紝鎵€浠ラ渶瑕佺户鎵縊bservable绫诲寘com.zhuang.observer.observable_example;importjava.util.Observable;/***@ClassnameThief*@Description灏忓伔绫荤户鎵縊bservable鎺ュ彛*@Date2021/3/2814:36*@Createdbydell*/publicclassThiefextendsObservable{privateStringname;publicThief(Stringname){this.name=name;}publicThief(){}publicStringgetName(){杩斿洖鍚嶇О锛泒publicvoidsetName(Stringname){this.name=name;}publicvoidsteal(){System.out.println("灏忓伔锛氭垜鍋蜂笢瑗夸簡锛屾湁娌℃湁浜烘潵鎶撴垜锛侊紒锛?);super.setChanged();//榛樿涓簍ruesuper.notifyObservers();}}璀﹀療鏄瀵熻€咃紝鎵€浠ラ渶瑕佸疄鐜癘bserver鎺ュ彛鍖卌om.zhuang.observer.observable_example;importjava.util.Observable;importjava.util.Observer;/***@ClassnamePolicemen*@DescriptionPolice绫诲疄鐜拌瀵熺被瀹炵幇鏇存柊鏂规硶*@Date2021/3/2814:36*@Createdbydell*/publicclassPolicemenimplementsObserver{privateStringname;鍏畨璀﹀療(Stringname){this.name=name;}publicStringgetName(){杩斿洖鍚嶇О锛泒publicvoidsetName(Stringname){this.name=name;}publicPolicemen(){}@Overridepublicvoidupdate(Observableo,Objectarg){System.out.println("Police:"+((Thief)o).getName()+"鎴戞姄鍒颁綘浜嗗搱鍝堝搱锛侊紒锛?);}}瀹㈡埛绔唬鐮佸寘com.zhuang.observer.observable_example;/***@ClassnameClient*@Description娴嬭瘯绫?@Date2021/3/2814:36*@Createdbydell*/publicclassClient{publicstaticvoidmain(String[]args){//灏忓伔瀵硅薄Thiefthief=newThief("寮犱笁");//璀﹀療瀵硅薄Policemenpolicemen=newPolicemen("灏忓簞璀﹀療");//璀﹀療鐩潃灏忓伔thief.addObserver(policemen);//灏忓伔鍋蜂笢瑗縯hief.steal();}}鍐欏湪鏈€鍚庡鏋滄垜鐨勬枃绔犲浣犳湁鐢紝璇风粰鎴戜竴涓煈嶏紝璋㈣阿馃槉锛佹湁浠€涔堥棶棰樻杩庡湪璇勮鍖烘寚鍑猴紒馃挭