1. 程式人生 > >設計模式總結 之 行為型

設計模式總結 之 行為型

/**
 * 中介者模式
 * 定義:用一箇中介者物件封裝一系列的物件互動,中介者使各物件不需要顯示地相互作用,從而使耦合鬆散,
而且可以獨立地改變它們之間的互動
 *
 * 抽象中介者:定義好同事類物件到中介者物件的介面,用於各個同事類之間的通訊。一般包括一個或幾個抽象的事件方法,
並由子類去實現。
 * 中介者實現類:從抽象中介者繼承而來,實現抽象中介者中定義的事件方法。從一個同事類接收訊息,然後通過訊息影響其他同時類。
 * 同事類:如果一個物件會影響其他的物件,同時也會被其他物件影響,那麼這兩個物件稱為同事類。在類圖中,同事類只有一個,
這其實是現實的省略,\
 * 
 * 在實際應用中,同事類一般由多個組成,他們之間相互影響,相互依賴。同事類越多,關係越複雜。
 * 並且,同事類也可以表現為繼承了同一個抽象類的一組實現組成。在中介者模式中,同事類之間必須通過中介者才能進行訊息傳遞。
 */

//抽象中介

abstract class AbstractSoftWare(val name: String) {
  private val persons = new ArrayBuffer[Person]()

  def addPerson(person: Person): Unit = {
    if (persons.forall(!person.eq(_))) {
      println(s"群 $name 添加了成員:${person.name}")
      persons += person
    } else {
      println(s"${person.name} 已經在群中了")
    }
  }

  def removePerson(person: Person) {
    if (persons.exists(person.eq(_))) {
      println(s"群 $name 刪除了成員:${person.name}")
      persons -= person
    } else {
      println(s"${person.name} 不在群中了")
    }
  }

  //群發
  def notify(person: Person, message: String): Unit = {
    if (persons.exists(person.eq(_))) {
      persons.filter(!person.eq(_)).foreach(p => println(s"${p.name}從${person.name}接收到資訊:$message"))
    } else {
      println(s"${person.name}您已經不在群組:$name")
    }
  }
  //私聊
  def pm(send: Person, receive: Person, message: String): Unit = send match {
    case s if persons.exists(s.eq(_)) => receive match {
      case r if persons.exists(r.eq(_)) => {
        println(s"${send.name} 傳送訊息 給 ${receive.name} 的訊息為: ${message}")
      }
      case _ => {
        println(s"${receive.name}沒有使用許可權 ")
      }
    }
    case _ => println(s"${send.name}沒有使用許可權 ")
  }
}

//具體中介 qq
class QQSoftware(name: String) extends AbstractSoftWare(name) {
  override def notify(person: Person, message: String): Unit = {
    println(s"這裡是qq群:$name")
    super.notify(person, message)
  }

  override def pm(send: Person, receive: Person, message: String): Unit = {
    println(s"使用qq軟體進行私聊")
    super.pm(send, receive, message)
  }

}

/**
 * msn,具體中介者
 * @param name 群名
 */
class MSNSoftware(name: String) extends AbstractSoftWare(name) {
  override def notify(person: Person, message: String): Unit = {
    println(s"這裡是msn群:$name")
    super.notify(person, message)
  }

  override def pm(send: Person, receive: Person, message: String): Unit = {
    println(s"使用msn軟體進行私聊")
    super.pm(send, receive, message)
  }

}

//抽象同事

abstract class Person(val name: String) {

  def setAbstractSoftware(software: AbstractSoftWare)

  /**
   * 發言
   * @param message 資訊
   */
  def speak(message: String): Unit

  /**
   * 刪除使用者
   * @param person 使用者
   */
  def remove(person: Person): Unit

  /**
   * 增加使用者
   * @param person 使用者
   */
  def add(person: Person): Unit

  /**
   * 私聊
   * @param person 接收者
   * @param message 資訊
   */
  def privateChat(person: Person, message: String): Unit
}

/**
 * 管理員角色,屬於同事
 * @param name 名稱
 */
class Admin(name: String) extends Person(name) {
  private var abstractSoftware: AbstractSoftWare = null

  def setAbstractSoftware(software: AbstractSoftWare) = abstractSoftware = software

  override def speak(message: String) = abstractSoftware.notify(this, message)

  /**
   * 刪除
   * @param person 使用者
   */
  def remove(person: Person) = abstractSoftware.removePerson(person)

  /**
   * 增加
   * @param person 使用者
   */
  def add(person: Person) = {
    println(s"${name}進行新增使用者${person.name}的操作")
    abstractSoftware.addPerson(person)
  }

  /**
   * 私聊
   * @param person 接收者
   * @param message 資訊
   */
  def privateChat(person: Person, message: String) = abstractSoftware.pm(this, person, message)
}

/**
 * 普通使用者角色,屬於同事
 * @param name 名稱
 */
class Member(name: String) extends Person(name) {
  private var abstractSoftware: AbstractSoftWare = null

  def setAbstractSoftware(software: AbstractSoftWare) = abstractSoftware = software

  override def speak(message: String) = abstractSoftware.notify(this, message)

  /**
   * 增加使用者
   * @param person 使用者
   */
  override def add(person: Person): Unit = {
    println(s"${name}您不是管理員,不具備增加使用者許可權")

  }

  /**
   * 判斷是否為刪除自己,如果是刪除自己則為退群
   * @param person 使用者
   */
  override def remove(person: Person): Unit = {
    if (person.eq(this)) {
      println(s"$name,您將退出${abstractSoftware.name}")
      abstractSoftware.removePerson(person)
    } else {
      println(s"${name}您不是管理員,不具備刪除使用者許可權")
    }
  }

  /**
   * 私聊
   * @param person 接收者
   * @param message 資訊
   */
  def privateChat(person: Person, message: String) = abstractSoftware.pm(this, person, message)
}

object mediator extends App {
  val admin: Person = new Admin("admin")
  val member1: Person = new Member("member1")
  val member2: Person = new Member("member2")
  val member3: Person = new Member("member3")
  val member4: Person = new Member("member4")

  val qqSoftware: AbstractSoftWare = new QQSoftware("研發中心")
  admin.setAbstractSoftware(qqSoftware)
  member1.setAbstractSoftware(qqSoftware)
  member2.setAbstractSoftware(qqSoftware)
  member3.setAbstractSoftware(qqSoftware)
  member4.setAbstractSoftware(qqSoftware)

  admin.add(admin)
  admin.add(member1)
  admin.add(member2)
  admin.add(member3)
  admin.add(member4)
  admin.add(member1)

  admin.speak("hello")
  admin.remove(member1)

  member1.speak("hi")

  member2.add(member1)
  member2.remove(member2)

  member2.speak("admin")

  member3.privateChat(admin, "你好")
  member3.privateChat(member2, "你好")

  member2.privateChat(admin, "加我")

  println("------------------------------------------")

  val msnSoftware: AbstractSoftWare = new MSNSoftware("通研事業部")
  admin.setAbstractSoftware(msnSoftware)
  member1.setAbstractSoftware(msnSoftware)
  member2.setAbstractSoftware(msnSoftware)
  member3.setAbstractSoftware(msnSoftware)
  member4.setAbstractSoftware(msnSoftware)

  admin.add(admin)
  admin.add(member1)
  admin.add(member2)
  admin.add(member3)
  admin.add(member4)
  admin.add(member1)

  admin.speak("hello")
  admin.remove(member1)

  member1.speak("hi")

  member2.add(member1)

  member2.speak("admin")

  member2.privateChat(member3, "test")
}


相關推薦

設計模式總結 行為

/** * 中介者模式 * 定義:用一箇中介者物件封裝一系列的物件互動,中介者使各物件不需要顯示地相互作用,從而使耦合鬆散,而且可以獨立地改變它們之間的互動 * * 抽象中介者:定義好同事類物件到中介者物件的介面,用於各個同事類之間的通訊。一般包括一個或幾個抽象的事件方法,並由子類去實現。 * 中介

設計模式分類行為模式

行為型模式包括觀察者模式、模板方法模式、命令模式、狀態模式、職責鏈模式、直譯器模式、中介者模式、訪問者模式、策略模式、備忘錄模式、迭代器模式。 觀察者模式 定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴它的物件都得到通知並被自動更新。 模板方法模式

設計模式的藝術 行為模式訪問者模式

前言 在公司上班,一般會有兼職或全職的員工,他們都發工資,上同樣的班,但是工資待遇是有區別的,財務部和人事部過來調查處理的手法也不是一樣的,雖然都是一樣的計算工資待遇,在軟體開發中存在著這樣的一種情況,我們需要處理著像員工一樣的集合,集合中的具體物件是不一樣的,去訪問時處理的手段也不一樣,軟體設

設計模式的藝術 行為模式模板方法模式

前言 生活中有許多事情可以理解成分步驟執行的東西,比如請客吃飯,無論吃什麼,一般都包含著點單,吃東西,買單幾個步驟,不論吃麵還是吃大餐,其他步驟不會變,最多變變點單,在軟體開發中,也會有類似的情況出現,我們可以有個點單的基類,然後子類裡面具體實現是吃麵還是點大餐,這就是模板方法模式,這種模式利用

設計模式的藝術 行為模式策略模式

前言 條條大路通羅馬,很多時候為了達到目標可供選擇的路徑不止一條,在軟體開發中也會存在這樣的情況,為了某一個功能有多條途徑,每一條途徑對應一種演算法,為了靈活的選擇解決途徑,策略模式就應運而生了 什麼是策略模式 Strategy Pattern 定義一系列演算法類,將每一個演算法封裝起來

設計模式的藝術 行為模式觀察者模式

前言 紅燈停,綠燈行,在日常的交通中,每每遇到紅燈,司機總是要在路口進行等待,等到綠燈才能通過,這個時候司機就扮演了一個觀察者的角色,隨著燈的顏色的變化,司機的行為也跟著變化,在軟體系統中,有些物件之間也存在類似交通訊號燈和汽車之間的關係,一個物件的的行為狀態改變導致了其他物件的狀態或行為也發生

設計模式的藝術 行為模式備忘錄模式

前言 每個人都會有後悔的時候,可是人生沒有後悔藥,做過的事情無法再去後悔,軟體設計中卻是有這麼一種後悔機制,叫做備忘錄模式,它就是軟體中的"後悔藥" 什麼是備忘錄模式  Memento Pattern 在不破壞封裝的前提下,捕獲一個物件的內部狀態,並在物件之外儲存這個狀態,這樣

設計模式的藝術 行為模式中介者模式

前言 微信有一個群聊功能,群聊中的資訊你不需要加別人為好友就可以接收的到資訊,因為群的機制,極大的減少了使用者之間的兩兩通訊,在軟體設計中,也有類似於微信使用者之間的關係,我們也可以借鑑微信群的模式,來降低物件與物件之間的互動,使得系統的耦合度大大降低 什麼是中介者模式 Mediator P

設計模式的藝術 行為模式迭代器模式

前言 現在的電視機都配置了一個遙控器,使用者可以通過遙控器去選擇上一個或者下一個臺,我們只需要知道如何使用這個遙控器,而無須關注電視是怎麼把電視訊道放入其中的,在軟體實際的開發中,也有這麼一種類,它儲存著多個成員物件,這些類通常稱為聚合類,對應的物件稱為聚合物件。為了方便操作這些聚合物件,同時可

設計模式的藝術 行為模式直譯器模式

前言 目前計算器程式語言有好幾百種,但是有時候人們還是希望能用一些簡單的語言表達實現一些特定的操作,比如輸入一個檔案,它就可以按照預定的格式進行解釋,從而實現相應的功能。 在現實的開發中,這些簡單的自定義語言可以通過現有的程式語言來設計,如果所基於的程式語言是面嚮物件語言,此時可以使用直譯器

設計模式的藝術 行為模式命令模式

前言 裝修新房子的最後幾道工序之一是安裝插座和開關,通過開關可以控制一些電器的開啟和關閉,例如電燈或者排氣扇,但是購買開關時其實並不知道它能夠控制什麼具體的電器。在軟體設計中,也存在著這樣的關係,請求傳送者和接收者物件,為了降低之間的耦合度,我們會將兩者進行解耦,會在兩者之間引入了新的命令物件,

設計模式的藝術 行為模式職責鏈模式

前言 幾乎所有的國人都打過鬥地主,規則很簡單,上家出牌,下家接牌,要不起則轉給下一家,一個迴圈下來,如果要不起則最初的出牌者繼續出牌,在這個過程中,牌作為一個請求沿著一條鏈在傳遞,每一個紙牌的玩家都可以處理該請求,在設計模式中,也有一種專門用於處理這種請求鏈方式的傳遞模式,我們把它稱之為職責鏈模

設計模式的藝術 行為模式中介者模式

前言 微信有一個群聊功能,群聊中的資訊你不需要加別人為好友就可以接收的到資訊,因為群的機制,極大的減少了使用者之間的兩兩通訊,在軟體設計中,也有類似於微信使用者之間的關係,我們也可以借鑑微信群的模式,來降低物件與物件之間的互動,使得系統的耦合度大大降低 什麼是中介者模式

設計模式的藝術 行為模式備忘錄模式

前言 每個人都會有後悔的時候,可是人生沒有後悔藥,做過的事情無法再去後悔,軟體設計中卻是有這麼一種後悔機制,叫做備忘錄模式,它就是軟體中的"後悔藥" 什麼是備忘錄模式  Memento Pattern 在不破壞封裝的前提下,捕獲一個物件的內部狀態,並在物件之外儲存這個狀

JAVA設計模式總結23種設計模式

ret 都對 松耦合 mem ava htm 初學者 並不是 不用 一、什麽是設計模式

設計模式分類結構模式

結構型模式包括介面卡模式、裝飾模式、橋接模式、組合模式、享元模式、代理模式、外觀模式。 介面卡模式 將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作 裝飾模式 動態地給一個物件新增一些額外的職責,就增

設計模式分類建立模式

建立型模式包括單例模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式。 1. 單例模式 保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 2. 工廠方法模式 定義一個用於建立物件的介面,讓子類決定例項化哪一個類,工廠模式使一個類的例項化延遲到其子類。 3. 抽象工廠模

設計模式總結TemplateMethod Pattern(模版方法模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: TemplateMethod Pattern(模版方法模式) 意圖 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個演算法的結構即可重定義該演算法的

設計模式總結Factory Method Pattern(工廠方法模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Simple Factory Pattern(簡單工廠模式) GoF中認為簡單工廠模式是工廠方法的一個特例。 結構  例子  優缺點 優點: 優點: 簡單,結合單例模式更加方便和節省資源。 缺點: 增加新的

設計模式總結Iterator Pattern(迭代器模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Iterator Pattern(迭代器模式) 意圖 提供一種方法順序訪問一個聚合物件中各個元素, 而又不需暴露該物件的內部表示。適用性 1. 訪問一個聚合物件的內容而無需暴露它的內部表示。 2. 支援對聚合