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