觀察者模式 + 中介者模式

定義為組合關(guān)系的產(chǎn)品和工廠,保證一個(gè)對象只能由固定的對象初始化的方法叫做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ā)事件給對應(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; // 獲取事件對象
    // 這里的兩層循環(huán)匹配,不是很好细疚;一般做法是通過文件或者容器配置規(guī)則
    // 另外如果一個(gè)處理角色對應(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) {
    // 注冊事件處理角色
    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();
// 注冊處理類
dispatch.registerConsumer(new Beggar());
factory = new Factory();
// 這一步會(huì)觸發(fā)添加事件疯兼,交給添加事件的consumer處理
product = factory.createProduct(...);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幕与,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子镇防,更是在濱河造成了極大的恐慌啦鸣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件来氧,死亡現(xiàn)場離奇詭異诫给,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啦扬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門中狂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扑毡,你說我怎么就攤上這事胃榕。” “怎么了瞄摊?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵勋又,是天一觀的道長。 經(jīng)常有香客問我换帜,道長楔壤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任惯驼,我火速辦了婚禮蹲嚣,結(jié)果婚禮上递瑰,老公的妹妹穿的比我還像新娘。我一直安慰自己隙畜,他們只是感情好抖部,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著议惰,像睡著了一般您朽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上换淆,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音几颜,去河邊找鬼倍试。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛋哭,可吹牛的內(nèi)容都是我干的县习。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼谆趾,長吁一口氣:“原來是場噩夢啊……” “哼躁愿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沪蓬,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤彤钟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后跷叉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逸雹,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年云挟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梆砸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡园欣,死狀恐怖帖世,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沸枯,我是刑警寧澤日矫,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站绑榴,受9級特大地震影響搬男,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彭沼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一缔逛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦褐奴、人聲如沸按脚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辅搬。三九已至,卻和暖如春脖旱,著一層夾襖步出監(jiān)牢的瞬間堪遂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工萌庆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溶褪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓践险,卻偏偏與公主長得像猿妈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子巍虫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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

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