Java委托机制
Posted enjoin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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, "要美女的联系方式"); } }
输出结果:
以上是关于Java委托机制的主要内容,如果未能解决你的问题,请参考以下文章
正文Java类加载器( CLassLoader ) 死磕 4: 神秘的双亲委托机制
对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段