1. 程式人生 > >Java委託機制

Java委託機制

Java委託

在委託模式中,有兩個物件參與處理同一個請求,接受請求的物件將請求委託給另一個物件來處理。委託模式是一項基本技巧,許多其他的模式,如狀態模式、策略模式、訪問者模式 本質上是在更特殊的場合採用了委託模式。委託模式使得我們可以用聚合來替代繼承,它還使我們可以模擬mixin。
  “委託”在C#中是一個語言級特性,而在Java語言中沒有直接的對應,但是java利用反射即可實現委託

委託者介面:

/** 
 * 委託者介面
 *  */
public interface Subject {
    /** 
     * 新增被委託物件
     * @param obj:被委託物件
     
*/ void addObserver(Observer obj); /** * 移除所有物件 */ void removeAll(); /** * 委託的事件 * @param s:委託物件 * @param obj:被委託物件 * @param o:傳給被委託者的資料 */ void event(Subject s,Observer obj,Object o); /** * 委託的很多事件 * @param s:委託物件 * @param obj:被委託物件
*/ void eventAll(Subject s,Object obj); /** * 獲取唯一標識name * @return name:委託物件的唯一標識(名字) */ String getName(); }

被委託者介面:

/**
 * 被委託者介面
 */
public interface Observer {
    /**
     * 被委託者所要執行的事(方法即處理程式)
     * @param s:委託者物件
     * @param data:委託需要做的事情資料
     */
    void doEvent(Subject s,Object data);
}

委託物件的類:

import java.util.*;
/**
 * 委託物件的類
 */
public class Delegation implements Subject{
    /**
     * 本類物件的唯一標識name
     * @param name
     */
    @SuppressWarnings("unused")
    private String name;
    /**
     * 儲存被委託者物件的集合,位於java.util包中
     */
    List<Observer> l = new ArrayList<>();
    /**
     * 構造方法
     */
    Delegation(String name){
        this.name = name;
    }
    /**
     * 新增被委託物件的方法
     * @param obj:被委託物件
     */
    @Override
    public void addObserver(Observer obj) {
        // TODO Auto-generated method stub
        if (l==null) {
            throw new NullPointerException();
        }
        else {
            if (!l.contains(obj)) {
                l.add(obj);
            }    
        }
    }    
    /**
     * 委託的事件方法
     */
    @Override
    public void event(Subject s,Observer obj,Object o) {
        // TODO Auto-generated method stub
        obj.doEvent(s,o);
    }
    /**
     * 移除所有被委託物件
     */
    @Override
    public void removeAll() {
        // TODO Auto-generated method stub
        l.clear();
    }
    /**
     * 全部被委託者要做的事件方法
     */
    @Override
    public void eventAll(Subject s,Object obj) {
        // TODO Auto-generated method stub
        for(Observer o:l) {
            o.doEvent(s,obj);
        }
    }
    /**
     * 獲取唯一標識name
     * @return name
     */
    @Override
    public String getName() {
        return name;
    }
}

被委託的物件的類:

/**
 * 被委託的物件的類
 */
class A implements Observer{
    /**
     * 被委託的物件的唯一標識
     */
    private String name;
    A(String name){
        this.name=name;
    }
    /**
     * 被委託物件要做的事情
     * @param data:事情資料
     */
    @Override
    public void doEvent(Subject s,Object data) {
        // TODO Auto-generated method stub
        System.out.println(s.getName()+"你好,"+"我是"+name+",你讓我"+data+"的事已經做完了!");
    }
    
}

測試類:

/**
 * 測試類,整個程式的入口
 * @author 張三
 *
 */
public class DelegationDemo {
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Delegation d = new Delegation("張三");
        A a = new A("李四");
        d.addObserver(a);
        d.event(d, a, "買早餐");
        A b = new A("王五");
        d.addObserver(b);
        d.eventAll(d, "要美女的聯絡方式");
    }
}

輸出結果: