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, "要美女的聯系方式");
    }
}

輸出結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM