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

    输出结果:

     

  • 相关阅读:
    C/C++ 编程中的内存屏障(Memory Barriers) (1)
    ubuntu 10.04 源
    内存屏障(经典)
    VMware设置桥接上网
    C/C++ 编程中的内存屏障(Memory Barriers) (2)
    寒假Day55:指针
    寒假Day54:poj2378Tree Cutting没用树形dp写的树的题dfs
    寒假Day50:CodeForces1324CFrog Jumps思维
    寒假Day50:51nod3047位移运算
    寒假Day53:Codeforces519B水题
  • 原文地址:https://www.cnblogs.com/hh2012/p/10025451.html
Copyright © 2020-2023  润新知