<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          漫畫:設(shè)計(jì)模式中的 “觀察者模式”

          共 2908字,需瀏覽 6分鐘

           ·

          2020-07-11 08:52

          ec471825fcd070b62bf69a4390879e4f.webp

          d65dd326937dd50a17b6e989b1477965.webp



          —————? 第二天? —————

          99ab95547d69974b81af84f38e112d77.webp

          4bd7bedb44cded6160e52e4663322f2c.webp

          2c0e3174f08709b66d837a87c113f056.webp

          f6ebd679a61d9e0eeca22e667c30ab49.webp

          35973493732255e87db81c095804a357.webp

          3577f957f798259aa8d7761670bd81c8.webp

          e85b243c7cd622f8dd2d154695abc7af.webp



          ————————————

          dbc4e4e7578b6fdfb14fe147e60a80e5.webp

          7554e97005a3147322b6d59c828e739d.webp

          7d49f279e2f8b85251259918449ad8e9.webp

          78c91e085eaaf8e896b9c9efedba85b2.webp

          53770fc787152f23ed6cf057d21c85dd.webp


          1a3a1264807a7d9ea18b3ea81f66cd62.webp

          465a765bdc0b9979d2a218198c11868a.webp



          場(chǎng)景1:游戲操作界面


          在一個(gè)小游戲中,包含一個(gè)簡(jiǎn)單的操作界面,界面上有兩個(gè)按鈕:道具和魔法。

          f6986387ae94a9f72c130b791bb468cb.webp


          如果點(diǎn)擊“道具”按鈕,游戲里的主角會(huì)使用道具;如果點(diǎn)擊“魔法”按鈕,游戲里的主角會(huì)使用魔法。


          d10b31a4950cdd23a38bcdbf1aecd5ca.webp


          如何讓主角實(shí)時(shí)接收到點(diǎn)擊按鈕的事件,并做出相應(yīng)的行動(dòng)呢?



          場(chǎng)景2:游戲迷宮


          同樣在這個(gè)小游戲里,有一個(gè)迷宮,迷宮里有怪物、陷阱和寶物。


          b2561dd18ee3a562d4e2c78b9fc1fe9a.webp


          一旦主角移動(dòng)到怪物的有效范圍,怪物會(huì)襲擊主角;主角移動(dòng)到陷阱的有效范圍,陷阱會(huì)困住主角;主角移動(dòng)到寶物的有效范圍,寶物會(huì)為主角加血。


          46eafdf9e1061e0bc42e5f4bfe8d0332.webp


          如何讓主角移動(dòng)的事件被怪物、陷阱、道具感知到,并做出正確的反應(yīng)?

          72e0b74f1dad18f30b2bf5aebac04ad7.webp

          eb36f714b55a5ccce644a35033f77bd7.webp


          fe2b5049f8444ee41473c005931cb147.webp


          32edbc8f92abe7d973c0ff37a0ae3a99.webp


          c498f6900974e647c6f640fc75df9be8.webp


          1eb4b9b382c68f2c17dfa339ca398e0d.webp

          624c762052740c56a4f020c7ba58bb0a.webp


          8095774e1b9ef9494fe730dff0f2968a.webp

          3cecbd576e1a4f09a8468d7f6a7cdb6b.webp


          public?class?Hero?{
          ????//怪物
          ????Monster?monster;
          ????//陷阱
          ????Trap?trap;
          ????//寶物
          ????Treasure?treasure;

          ????public?void?move(){
          ????????System.out.println("主角向前移動(dòng)");
          ????????//主角移動(dòng)時(shí),分別通知怪物、陷阱和寶物對(duì)象
          ????????monster.update();
          ????????trap.update();
          ????????treasure.update();
          ????}
          }


          57b5047f6f65a50d068b4c6fcfc1da6b.webp

          367d3e8abb85d08be913482f97f2d27f.webp

          1317c73fe6a28600da494b2c5d520c99.webp

          ae5fa7dc09ad16c8ee04b007621c9af3.webp


          3fb529821099d974a754f120c6730126.webp


          603d54cf38f50f27446f485c6b4e404c.webp

          d8fc5906ffc5c570944e9f911647f029.webp

          44217ea5a408c35145327bcb589283c2.webp


          292d1420d0a21546a4c5d7c644e04d3f.webp


          在上面的UML圖中,主要有兩組實(shí)體對(duì)象,一組是觀察者,一組是被觀察者。所有的觀察者,都實(shí)現(xiàn)了Observer接口;所有的被觀察者,都繼承自Subject抽象類。


          Subject類的成員OberverList,存儲(chǔ)著已注冊(cè)的觀察者,當(dāng)事件發(fā)生時(shí),會(huì)通知列表中的所有觀察者。需要注意的是,OberverList所依賴的是抽象的Observer接口,這樣就避免了觀察者與被觀察者的緊耦合。

          743f07cb012f6858a010cebf6068d4c4.webp

          89a4808f60ca73ddb448f7796f4ac883.webp


          //觀察者
          public?interface?Observer?{
          ????public?void?update();
          }

          //被觀察者
          abstract?public?class?Subject?{

          ????private?List?observerList?=?new?ArrayList();

          ????public?void?attachObserver(Observer?observer)?{
          ????????observerList.add(observer);
          ????}

          ????public?void?detachObserver(Observer?observer){
          ????????observerList.remove(observer);
          ????}

          ????public?void?notifyObservers(){
          ????????for?(Observer?observer:?observerList){
          ????????????observer.update();
          ????????}
          ????}
          }


          c6caa8ac6e07912d385ed4b98512e2e5.webp

          //怪物
          public?class?Monster?implements?Observer?{

          ????@Override
          ????public?void?update()?{
          ????????if(inRange()){
          ????????????System.out.println("怪物?對(duì)主角攻擊!");
          ????????}
          ????}

          ????private?boolean?inRange(){
          ????????//判斷主角是否在自己的影響范圍內(nèi),這里忽略細(xì)節(jié),直接返回true
          ????????return?true;
          ????}
          }

          //陷阱
          public?class?Trap?implements?Observer?{

          ????@Override
          ????public?void?update()?{
          ????????if(inRange()){
          ????????????System.out.println("陷阱?困住主角!");
          ????????}
          ????}

          ????private?boolean?inRange(){
          ????????//判斷主角是否在自己的影響范圍內(nèi),這里忽略細(xì)節(jié),直接返回true
          ????????return?true;
          ????}
          }

          //寶物
          public?class?Treasure?implements?Observer?{

          ????@Override
          ????public?void?update()?{
          ????????if(inRange()){
          ????????????System.out.println("寶物?為主角加血!");
          ????????}
          ????}

          ????private?boolean?inRange(){
          ????????//判斷主角是否在自己的影響范圍內(nèi),這里忽略細(xì)節(jié),直接返回true
          ????????return?true;
          ????}
          }



          上面代碼中,每一個(gè)具體觀察者類都實(shí)現(xiàn)了update方法,這是事件觸發(fā)的回調(diào)方法,包含了具體觀察者對(duì)事件的不同反應(yīng)。


          5804ae4c6fe8b08b423cdf40988f0944.webp


          public?class?Hero?extends?Subject{
          ????void?move(){
          ????????System.out.println("主角向前移動(dòng)");
          ????????notifyObservers();
          ????}
          }


          當(dāng)主角移動(dòng)時(shí),通知所有已注冊(cè)的觀察者,執(zhí)行具體觀察者各自的update方法。

          3458a2d4cc22044459c0d1df49dbd5f2.webp


          public?class?Client?{

          ????public?static?void?main(String[]?args)?{
          ????????//初始化對(duì)象
          ????????Hero?hero?=?new?Hero();
          ????????Monster?monster?=?new?Monster();
          ????????Trap?trap?=?new?Trap();
          ????????Treasure?treasure?=?new?Treasure();
          ????????//注冊(cè)觀察者
          ????????hero.attachObserver(monster);
          ????????hero.attachObserver(trap);
          ????????hero.attachObserver(treasure);
          ????????//移動(dòng)事件
          ????????hero.move();
          ????}
          }


          代碼輸出如下:


          主角向前移動(dòng)

          怪物 對(duì)主角攻擊!

          陷阱 困住主角!

          寶物 為主角加血!


          52299251fed2713eeb53c3c8183946e6.webp


          bdfe3d0af8e34b70008a91b2e2a1cf25.webp


          6a7468b924b3bf2cb48e0b0778268b03.webp

          9c33f12c0ef0de5f463773d76d1bfe5e.webp



          c907b3cd61a90320c926d1fe5b4ef020.webp

          1.?人人都能看懂的 6 種限流實(shí)現(xiàn)方案!

          2.?一個(gè)空格引發(fā)的“慘案“

          3.?大型網(wǎng)站架構(gòu)演化發(fā)展歷程

          4.?Java語(yǔ)言“坑爹”排行榜TOP 10

          5. 我是一個(gè)Java類(附帶精彩吐槽)

          6. 看完這篇Redis緩存三大問(wèn)題,保你能和面試官互扯

          7. 程序員必知的 89 個(gè)操作系統(tǒng)核心概念

          8. 深入理解 MySQL:快速學(xué)會(huì)分析SQL執(zhí)行效率

          9. API 接口設(shè)計(jì)規(guī)范

          10. Spring Boot 面試,一個(gè)問(wèn)題就干趴下了!



          8d52aa1da799b8f43823499292bb15c1.webp

          掃碼二維碼關(guān)注我


          ·end·

          —如果本文有幫助,請(qǐng)分享到朋友圈吧—

          我們一起愉快的玩耍!



          0435e3d44117e0d135c8c5c6eb052a04.webp你點(diǎn)的每個(gè)贊,我都認(rèn)真當(dāng)成了喜歡
          瀏覽 15
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天曰天天干天天射Av | 欧美成人黄色免费网站 | 加勒比在线精品视频 | 欧美三级片在线 | 特级西西体4444 |