{"id":7125,"date":"2023-03-05T16:17:04","date_gmt":"2023-03-05T08:17:04","guid":{"rendered":"https:\/\/1989lifejourney.com\/?p=7125"},"modified":"2023-03-05T16:17:04","modified_gmt":"2023-03-05T08:17:04","slug":"design-pattern-observer-pattern","status":"publish","type":"post","link":"https:\/\/1989lifejourney.com\/?p=7125","title":{"rendered":"Design pattern &#8211; Observer pattern"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>\u54ea\u7a2eDesign pattern(<em>Creational<\/em>\/Structural\/Behavioural):<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Behavioural pattern<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u76ee\u7684:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8655\u7406\u4e00\u5c0d\u591a\u7684\u7269\u4ef6\u95dc\u4fc2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/tpcg.io\/_73IFP9\">http:\/\/tpcg.io\/_73IFP9<\/a><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler\"><div class=\"wp-block-embed__wrapper\">\n<style>.gist table { margin-bottom: 0; }<\/style><div style=\"tab-size: 8\" id=\"gist121240970\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-observerpatternexample-swift\" class=\"file my-2\">\n    \n    <div itemprop=\"text\"\n      class=\"Box-body p-0 blob-wrapper data type-swift  \"\n      style=\"overflow: auto\" tabindex=\"0\" role=\"region\"\n      aria-label=\"observerPatternExample.swift content, created by tgnivekucn on 08:16AM on March 05, 2023.\"\n    >\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"{{ revealButtonHref }}\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"observerPatternExample.swift\">\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L1\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"1\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC1\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L2\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"2\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC2\" class=\"blob-code blob-code-inner js-file-line\">class Subject {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L3\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"3\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC3\" class=\"blob-code blob-code-inner js-file-line\">    var list: [Adventurer] = []<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L4\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"4\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC4\" class=\"blob-code blob-code-inner js-file-line\">    func add(adventurer: Adventurer) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L5\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"5\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC5\" class=\"blob-code blob-code-inner js-file-line\">        list.append(adventurer)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L6\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"6\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC6\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L7\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"7\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC7\" class=\"blob-code blob-code-inner js-file-line\">    func remove(adventurer: Adventurer) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L8\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"8\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC8\" class=\"blob-code blob-code-inner js-file-line\">        if let index = list.firstIndex(where: { $0 == adventurer}) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L9\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"9\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC9\" class=\"blob-code blob-code-inner js-file-line\">            list.remove(at: index)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L10\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"10\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC10\" class=\"blob-code blob-code-inner js-file-line\">        }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L11\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"11\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC11\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L12\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"12\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC12\" class=\"blob-code blob-code-inner js-file-line\">    func sendQuestions(question: String) {}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L13\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"13\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC13\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L14\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"14\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC14\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L15\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"15\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC15\" class=\"blob-code blob-code-inner js-file-line\">class Association: Subject {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L16\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"16\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC16\" class=\"blob-code blob-code-inner js-file-line\">    override func sendQuestions(question: String) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L17\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"17\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC17\" class=\"blob-code blob-code-inner js-file-line\">        print(&quot;send questions&quot;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L18\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"18\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC18\" class=\"blob-code blob-code-inner js-file-line\">        list.forEach { $0.getQuestions(question: question) }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L19\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"19\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC19\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L20\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"20\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC20\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L21\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"21\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC21\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L22\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"22\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC22\" class=\"blob-code blob-code-inner js-file-line\">class Adventurer: Hashable {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L23\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"23\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC23\" class=\"blob-code blob-code-inner js-file-line\">    var id: String<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L24\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"24\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC24\" class=\"blob-code blob-code-inner js-file-line\">    var name: String<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L25\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"25\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC25\" class=\"blob-code blob-code-inner js-file-line\">    init(id: String, name: String) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L26\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"26\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC26\" class=\"blob-code blob-code-inner js-file-line\">        self.id = id<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L27\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"27\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC27\" class=\"blob-code blob-code-inner js-file-line\">        self.name = name<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L28\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"28\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC28\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L29\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"29\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC29\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L30\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"30\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC30\" class=\"blob-code blob-code-inner js-file-line\">    func hash(into hasher: inout Hasher) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L31\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"31\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC31\" class=\"blob-code blob-code-inner js-file-line\">        hasher.combine(id)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L32\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"32\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC32\" class=\"blob-code blob-code-inner js-file-line\">        hasher.combine(name)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L33\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"33\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC33\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L34\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"34\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC34\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L35\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"35\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC35\" class=\"blob-code blob-code-inner js-file-line\">    static func == (lhs: Adventurer, rhs: Adventurer) -&gt; Bool {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L36\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"36\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC36\" class=\"blob-code blob-code-inner js-file-line\">        return lhs.id == rhs.id<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L37\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"37\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC37\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L38\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"38\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC38\" class=\"blob-code blob-code-inner js-file-line\">    <\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L39\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"39\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC39\" class=\"blob-code blob-code-inner js-file-line\">    func getQuestions(question: String) {}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L40\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"40\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC40\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L41\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"41\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC41\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L42\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"42\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC42\" class=\"blob-code blob-code-inner js-file-line\">class Bard: Adventurer {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L43\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"43\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC43\" class=\"blob-code blob-code-inner js-file-line\">    override func getQuestions(question: String) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L44\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"44\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC44\" class=\"blob-code blob-code-inner js-file-line\">        print(&quot;Bard get question&quot;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L45\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"45\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC45\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L46\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"46\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC46\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L47\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"47\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC47\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L48\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"48\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC48\" class=\"blob-code blob-code-inner js-file-line\">class Gunman: Adventurer {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L49\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"49\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC49\" class=\"blob-code blob-code-inner js-file-line\">    override func getQuestions(question: String) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L50\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"50\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC50\" class=\"blob-code blob-code-inner js-file-line\">        print(&quot;Gunman get question&quot;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L51\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"51\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC51\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L52\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"52\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC52\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L53\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"53\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC53\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L54\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"54\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC54\" class=\"blob-code blob-code-inner js-file-line\">class Lancer: Adventurer {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L55\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"55\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC55\" class=\"blob-code blob-code-inner js-file-line\">    override func getQuestions(question: String) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L56\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"56\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC56\" class=\"blob-code blob-code-inner js-file-line\">        print(&quot;Lancer get question&quot;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L57\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"57\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC57\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L58\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"58\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC58\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L59\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"59\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC59\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L60\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"60\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC60\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L61\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"61\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC61\" class=\"blob-code blob-code-inner js-file-line\">let lancer = Lancer(id: UUID().uuidString, name: &quot;lancer&quot;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L62\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"62\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC62\" class=\"blob-code blob-code-inner js-file-line\">let bard = Bard(id: UUID().uuidString, name: &quot;bard&quot;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L63\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"63\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC63\" class=\"blob-code blob-code-inner js-file-line\">let gunman = Gunman(id: UUID().uuidString, name: &quot;gunman&quot;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L64\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"64\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC64\" class=\"blob-code blob-code-inner js-file-line\">let association = Association()<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L65\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"65\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC65\" class=\"blob-code blob-code-inner js-file-line\">association.add(adventurer: lancer)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L66\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"66\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC66\" class=\"blob-code blob-code-inner js-file-line\">association.add(adventurer: bard)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L67\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"67\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC67\" class=\"blob-code blob-code-inner js-file-line\">association.add(adventurer: gunman)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L68\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"68\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC68\" class=\"blob-code blob-code-inner js-file-line\">association.sendQuestions(question: &quot;ChatGPT can substitute the work of people :D&quot;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-observerpatternexample-swift-L69\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"69\"><\/td>\n          <td id=\"file-observerpatternexample-swift-LC69\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/tgnivekucn\/053fb9a658de1815b4d6257b30955595\/raw\/e4f278abf147e9738d6839a636009aba6b4a7852\/observerPatternExample.swift\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/tgnivekucn\/053fb9a658de1815b4d6257b30955595#file-observerpatternexample-swift\" class=\"Link--inTextBlock\">\n          observerPatternExample.swift\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n<\/div>\n\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\u54ea\u7a2eDesign pattern(Creational\/Structural\/Behavioural): Be [&hellip;]<\/p>\n","protected":false},"author":139426785,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_postgate_lock_override":"inherit","_postgate_lock_mode":"inherit","_postgate_preview_mode":"inherit","_postgate_preview_limit":0,"_postgate_product_ids":[],"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[36769,11176,55138170],"tags":[],"post_folder":[],"class_list":["post-7125","post","type-post","status-publish","format-standard","hentry","category-design-pattern","category-software-engineering","category-technology-sharing"],"jetpack_publicize_connections":[],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/paR5vw-1QV","jetpack-related-posts":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=\/wp\/v2\/posts\/7125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=\/wp\/v2\/users\/139426785"}],"replies":[{"embeddable":true,"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7125"}],"version-history":[{"count":3,"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=\/wp\/v2\/posts\/7125\/revisions"}],"predecessor-version":[{"id":7128,"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=\/wp\/v2\/posts\/7125\/revisions\/7128"}],"wp:attachment":[{"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7125"},{"taxonomy":"post_folder","embeddable":true,"href":"https:\/\/1989lifejourney.com\/index.php?rest_route=%2Fwp%2Fv2%2Fpost_folder&post=7125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}