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类加载器及其委托机制

正文Java类加载器( CLassLoader ) 死磕 4: 神秘的双亲委托机制

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

深入理解java动态代理的实现机制

Java重要技术(28)类加载器之类加载器的层次关系和委托加载机制

ClassLoader双亲委托机制流程