LoginSignup
0
0

More than 3 years have passed since last update.

Apex デザインパターン Observer

Last updated at Posted at 2021-03-07

はじめに

Apexクラスをデザインパターンで実装する。

Observer パターン

被験者(Subjectクラス)の状態が変化したことを観測者(Observerクラス)へ通知する。

クラス図

Observe (2).png

利点

・Observerの具象クラス単位に処理を移譲できる

実装

ContactTrigger.apxt
/**
 *  取引先責任者のトリガ
 */
trigger ContactTrigger on Contact (before insert, before update, before delete, after insert, after update, after delete) {

    ContactTriggerHandler handler=new ContactTriggerHandler();

    handler.oldObjects=Trigger.old;
    handler.newObjects=Trigger.new;
    handler.oldObjectsMap=Trigger.oldMap;
    handler.newObjectsMap=Trigger.newMap;

    handler.addObservers();

    if(Trigger.isBefore && Trigger.isInsert){
        handler.notifyBeforeInsertObserver();
    }
    if(Trigger.isBefore && Trigger.isUpdate){
        handler.notifyBeforeUpdateObserver();
    }
    if(Trigger.isBefore && Trigger.isDelete){
        handler.notifyBeforeDeleteObserver();
    }
    if(Trigger.isAfter && Trigger.isInsert){
        handler.notifyAfterInsertObserver();
    }
    if(Trigger.isAfter && Trigger.isUpdate){
        handler.notifyAfterUpdateObserver();
    }
    if(Trigger.isAfter && Trigger.isDelete){
        handler.notifyAfterDeleteObserver();
    }

}
BaseTriggerHandler.apxc
/**
 *  トリガハンドラの基底クラス
 */
public virtual class BaseTriggerHandler {

    public List<SObject> oldObjects{get; set;}
    public List<SObject> newObjects{get; set;}
    public Map<Id, SObject> oldObjectsMap{get; set;}
    public Map<Id, SObject> newObjectsMap{get; set;}

    private List<BaseTriggerObserver> obserbers=new List<BaseTriggerObserver>();

    public virtual void addObservers(BaseTriggerObserver obserber){
         this.obserbers.add(obserber);
    }

    public void notifyBeforeInsertObserver(){
        for(BaseTriggerObserver observe: this.obserbers){
            observe.beforeInsert(this.newObjects);
        }
    }
    public void notifyBeforeUpdateObserver(){
        for(BaseTriggerObserver observe: obserbers){
            observe.beforeUpdate(this.oldObjects, this.newObjects, this.oldObjectsMap, this.newObjectsMap);
        }
    }    
    public void notifyBeforeDeleteObserver(){
        for(BaseTriggerObserver observe: this.obserbers){
            observe.beforeDelete(this.newObjects, this.newObjectsMap);
        }
    }
    public void notifyAfterInsertObserver(){
        for(BaseTriggerObserver observe: this.obserbers){
            observe.afterInsert(newObjects, newObjectsMap);
        }
    }
    public void notifyAfterUpdateObserver(){
        for(BaseTriggerObserver observe: obserbers){
            observe.afterUpdate(oldObjects, newObjects, oldObjectsMap, newObjectsMap);
        }
    }    
    public void notifyAfterDeleteObserver(){
        for(BaseTriggerObserver observe: this.obserbers){
            observe.afterDelete(oldObjects, oldObjectsMap);
        }
    }

}
BaseTriggerObserver.apxt
/**
 *  トリガオブザーバの基底インターフェイス
 */
public Interface BaseTriggerObserver {
    void beforeInsert(List<SObject> oldObjects);
    void beforeUpdate(List<SObject> oldObjects, List<SObject> newObjects, Map<Id, SObject> oldObjectsMap, Map<Id, SObject> newObjectsMap);
    void beforeDelete(List<SObject> oldObjects, Map<Id, SObject> oldObjectsMap);
    void afterInsert(List<SObject> newObjects, Map<Id, SObject> newObjectsMap);
    void afterUpdate(List<SObject> oldObjects, List<SObject> newObjects, Map<Id, SObject> oldObjectsMap, Map<Id, SObject> newObjectsMap);
    void afterDelete(List<SObject> oldObjects, Map<Id, SObject> oldObjectsMap);
}
ContactTriggerHandler.apxt
/**
 *  取引先責任者のトリガハンドラ
 */
public class ContactTriggerHandler extends BaseTriggerHandler{
    public void addObservers(){
        super.addObservers(new ContactTriggerObserver_Test());
    }
}
ContactTriggerObserver_Test.apxt
/**
 *  取引先責任者をxxxする
 */
public class ContactTriggerObserver_Test implements BaseTriggerObserver {

    public void beforeInsert(List<SObject> oldObjects){
        for(Contact contact: (List<Contact>)oldObjects){
            System.debug('beforeInsert='+contact);
        }    
    }

    public void beforeUpdate(List<SObject> oldObjects, List<SObject> newObjects, Map<Id, SObject> oldObjectsMap, Map<Id, SObject> newObjectsMap){
        for(Contact contact: (List<Contact>)newObjects){
            System.debug('beforeUpdate='+contact);
        }  
    }

    public void beforeDelete(List<SObject> oldObjects, Map<Id, SObject> oldObjectsMap){}
    public void afterInsert(List<SObject> newObjects, Map<Id, SObject> newObjectsMap){}
    public void afterUpdate(List<SObject> oldObjects, List<SObject> newObjects, Map<Id, SObject> oldObjectsMap, Map<Id, SObject> newObjectsMap){}
    public void afterDelete(List<SObject> oldObjects, Map<Id, SObject> oldObjectsMap){}

}

課題

・Observerの具象クラスをどの単位で分割して実装するか

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0