觀察者模式 + 中介者模式

定義為組合關(guān)系的產(chǎn)品和工廠,保證一個(gè)對(duì)象只能由固定的對(duì)象初始化的方法叫做Single Call,兩者有相同的生命期:
Product 產(chǎn)品類

 // 帶工廠的構(gòu)建方法 
public Product(Factory, xxx...) {
    /* 工廠能否生產(chǎn)指定product的布爾值屬性
    判斷邏輯在product里定義,產(chǎn)品和工廠同時(shí)決定是否有生產(chǎn)權(quán)限,這種方式叫Single Call
    普通的工廠模式,可能只是工廠單方面授權(quán)生產(chǎn)產(chǎn)品
    */
   if (factory.canCreateProduct()) {
    this.xxx = xxx;
    ...
  } 
}

Factory 工廠類

private boolean canPermittedCreate = false;
// 起到橋梁的作用,將產(chǎn)品和事件銜接在一起
public Product createProduct() {
  Product p = new Product(this, ...);
  // 產(chǎn)生事件
  new ProductEvent(p, ProductEventType.ADD);
  return p;
}

// 刪除邏輯 + 產(chǎn)生刪除事件
public void abandonProduct(Product p) {
  new ProductEvent(...);
  p = null;
}

// 更新同理
public void editProduct(Product p, String xxx) {
  ...
}

public boolean canCreateProduct() {
  return canPermittedCreate
}

ProductEventType 產(chǎn)品的事件類型枚舉
枚舉自帶單例模式,避免實(shí)例數(shù)量膨脹,同時(shí)存在線程安全的隱患(要盡量設(shè)計(jì)成無狀態(tài),檢驗(yàn)的一種想法是多次調(diào)用返回同樣的結(jié)果,這種線程問題適用于所有靜態(tài)方法設(shè)計(jì)的考慮點(diǎn);如果存在狀態(tài)就需要加鎖同步,這種情況下單例模式相比多實(shí)例會(huì)有性能問題)

enum EventType {
  ADD, DEL,EDIT;
}

ProductEvent 事件類

// 繼承了Observable類
// 這個(gè)jdk提供的被觀察者模式類,提供了localArr,synchronize,Vector等線程安全機(jī)制
class ProductEvent extends Observable {
  Product sourceProduct; // 事件發(fā)起方
  ProductEventType type; // 時(shí)間類型
  
  public ProductEvent(Product, ProductEventType) {
    this.source = product;
    this.type = type;
    notifyEventDispatch(); // 創(chuàng)建完事件后立即觸發(fā)事件  
  }
  
  // 主要調(diào)用jdk提供的觀察者模式流程
  private void notifyEventDispatch() {
    // 增加觀察者
    super.addObserver(EventDispatch.getEvenetDispatchc());
    // 打開通知開關(guān)
    super.setChanged();
    // 通知觀察者
    super.notifyObserver(source);
  }
}

EventDispatch

  1. 作為觀察者觀察事件
  2. 同時(shí)作為中介者分發(fā)事件
  3. 管理事件處理者(觀察到事件變化,分發(fā)事件給對(duì)應(yīng)的處理者)
  //   實(shí)現(xiàn)jdk提供的觀察者接口
class EventDispatch implements Observer {
  // 內(nèi)部實(shí)例化了自己一個(gè)常量私有實(shí)例,單例模式
  private final static EventDispatch dispatch = new EventDispatch();
   // 事件消費(fèi)者集合
  private Vector<EventConsumer> customer = new Vector<EventConsumer>(); 
  // 私有化構(gòu)造方法,保證單例
  private EventDispatch() {}
  public static EventDispatch getEventDispatchc() {
    return dispatch; // 獲取單例  
  }
  public void update(Observable o, Object arg) {
    ProductEvent event = (ProductEvent)o; // 獲取事件對(duì)象
    // 這里的兩層循環(huán)匹配,不是很好;一般做法是通過文件或者容器配置規(guī)則
    // 另外如果一個(gè)處理角色對(duì)應(yīng)多個(gè)事件的情況,可以使用責(zé)任鏈模式(一個(gè)處理者有一個(gè)責(zé)任鏈屬性,責(zé)任鏈上每個(gè)handler處理一種類型的事件)
    for (EventConsumer e : customer) {
      for (EventConsumeType t : e.getConsumeType()) {
        // 處理能力是否匹配
        if (t == event.getEventType) {
          e.exec(event); // 處理事件
        }
      }
    }
  }
  public void registerConsumer(EventConsumer consumer) {
    // 注冊(cè)事件處理角色
    customer.add(consumer);
  }
}

EventConsumer 事件處理類

abstract class EventConsumer {
  // 能夠處理的事件類型集合
  private Vector<EventConsumerType> customType =
    new Vector<EventConsumerType>();
  
  public void add(type) {
    customType.add(type);
  }
  
  abstract void exec(event);
}

事件處理實(shí)現(xiàn)類

Beggar extends EventConsumer {
   public Beggar() {
    // 硬編碼該事件處理角色能夠處理的事件類型
    super(EventType.DEL);
   }
}

例子

// 單例實(shí)例化
dispatch = EventDispatch.getEventDispatchc();
// 注冊(cè)處理類
dispatch.registerConsumer(new Beggar());
factory = new Factory();
// 這一步會(huì)觸發(fā)添加事件,交給添加事件的consumer處理
product = factory.createProduct(...);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,289評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,826評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,736評(píng)論 18 399
  • 1 場(chǎng)景問題# 1.1 如果沒有主板## 大家都知道,電腦里面各個(gè)配件之間的交互,主要是通過主板來完成的(事實(shí)上主...
    七寸知架構(gòu)閱讀 2,208評(píng)論 0 56
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,734評(píng)論 25 708
  • 早就接觸簡(jiǎn)書了,但是一直沒寫點(diǎn)什么。 這回第一次寫了篇文章《沒男友,你活該》,設(shè)置了打賞為1元,主要是為了求鼓勵(lì)。...
    邊玩邊學(xué)習(xí)邊掙錢閱讀 919評(píng)論 0 1