2019独角兽企业重金招聘Python工程师标准>>>

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。
“委托”在C#中是一个语言级特性,而在Java语言中没有直接的对应,但是我们可以通过动态代理来实现委托!代码如下:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
   
public abstract class Delegator implements InvocationHandler {
    //--------------------------------------------

protected Object obj_orgin = null; //原始对象
    protected Object obj_proxy = null; //代理对象
    //--------------------------------------------

public Delegator() {
    }

public Delegator(Object orgin) {
        this.createProxy(orgin);
    }

protected Object createProxy(Object orgin) {
        obj_orgin = orgin;
        //下面语句中orgin.getClass().getClassLoader()为加载器,orgin.getClass().getInterfaces()为接口集
        obj_proxy = Proxy.newProxyInstance(orgin.getClass().getClassLoader(), orgin.getClass().getInterfaces(), this); //委托
        return obj_proxy;
    }

protected Object invokeSuper(Method method, Object[] args) throws Throwable {
        return method.invoke(obj_orgin, args);
    }
    //--------------实现InvocationHandler接口,要求覆盖------------
    //下面实现的方法是当委托的类调用toString()方法时,操作其他方法而不是该类默认的toString(),这个类的其他方法则不会。

public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
        // 缺省实现:委托给obj_orgin完成对应的操作
        if (method.getName().equals("toString")) { //对其做额外处理
            return this.invokeSuper(method, args) + "$Proxy";
        } else { //注意,调用原始对象的方法,而不是代理的(obj==obj_proxy)
            return this.invokeSuper(method, args);
        }
    }
}

下面的代码,则是作为一个委托的例子,实现Map的功能。
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.bs2.core.UtilLog;

public class Delegator4Map extends Delegator {
    private static Log _log = LogFactory.getLog(Delegator4Map.class);
    private Map orginClass = null; //原始对象
    private Map proxyClass = null; //代理对象

public Map getOrgin() {
        return orginClass;
    }

public Map getProxy() {
        return proxyClass;
    }

public Delegator4Map(Map orgin) {
        super(orgin);
        orginClass = orgin;
        proxyClass = (Map) super.obj_proxy;
    }

public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("size")) { //修改size处理逻辑
            Object res2 = new Integer(-1);
            System.out.println("调用委托的方法");
            return res2;
        } else {
            System.out.println("调用原始的方法");
            return super.invoke(obj, method, args);
        }
    }

public static void main(String[] args) throws IOException {
        Delegator4Map rtm = new Delegator4Map(new Hashtable());
        Map m = rtm.getProxy();
        m.size();
    }
}

代码编写有个这样的原则:能不用继承就不用继承,能使用委托实现的就不使用继承。两个类有明显示的层级关系时使用继承,没有明显的层级关系,仅仅是为了在一个类中使用另一个类的方法时应该使用委托。

根据《重构》一书称:现在有滥用继承的趋势,JDK 中 Stack 就是一个滥用继承的典型!

java.util.Stack 继承自 java.util.Vector,其实 Stack 与 Vector 在用途上完全是风马牛不相及的两个容器。

转载于:https://my.oschina.net/u/108286/blog/33103

Java中的委托模式相关推荐

  1. Java中特质模式的定义

    在本文中,我将介绍特征的概念,并为您提供一个如何在Java中使用它们以在对象设计中减少冗余的具体示例. 我将首先提出一个虚构的案例,其中可以使用特征来减少重复,然后以使用Java 8的特征模式示例实现 ...

  2. Java笔记-Java中桥接模式

    最近在研究一个APP,逆向后发现貌似用了桥接模式,特意学习了下Java中的桥接模式. 关于C++的桥接链接如下: https://blog.csdn.net/qq78442761/article/de ...

  3. Java笔记-Java中备忘录模式

    首先设计模式代表外招功法,是外招的模板,个人觉得他是为面向对象7个原则而准备的: 面向对象程序设计要考虑7个原则: 单一职责原则:设计目的单一的类: 开放封闭原则:对扩展开发,对修改封闭: 李氏替换原 ...

  4. java中KMP模式,Java数据结构-串及其应用-KMP模式匹配算法

    串(string)是由零个或多个宇符组成的有限序列,又名叫字符串. 定义的解释: ??串中的字符数目n称为串的长度,定义中谈到"有限"是指长度n是一个有限的数值. ??零个字符的串 ...

  5. Java中的模式 --- 命令模式

    一,命令模式的实现: 命令模式里边一般都有以下几个角色:客户端,请求者,命令接口,命令实现,接受者, 下边是简单命令模式的实现代码实现:  1  public class Client{  2     ...

  6. java中mvc模式是什么_什么是MVC模式 MVC模式中三者之间关系

    MVC模式设计的初衷是,一旦一个项目的代码量变大的时候,src文件夹中可以写java代码,web文件夹中也可以写jsp代码.除此之外src中还可以写好多包,web文件夹中还可以写好多文件夹,现在假如新 ...

  7. Java中的委托和继承(Delegation and Inheritance)

    写在前面 概念 Delegation(委托) 委派的几种类型归纳 Dependency(依赖): 临时性的delegation Association(关联): 永久性的delegation Comp ...

  8. java中装潢模式_JAVA中的设计模式四(装饰模式)

    -------装饰模式 装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建 ...

  9. java中KMP模式_朴素模式匹配算法、kmp模式匹配算法、kmp模式匹配算法改进。java代码...

    ** 朴素模式匹配算法.kmp模式匹配算法.kmp模式匹配算法改进.java代码** 思路过段时间整理~ 可以先看看阮一峰的这篇博客,字符串匹配的KMP算法 package edu.hubu.base ...

最新文章

  1. php,cgi,nginx关系
  2. GitHub上那些值得一试的JAVA开源库--转
  3. 科研实习 | 北京大学智能学院贺笛老师招收NLP/GNN方向科研实习生
  4. 一、spring mvc简介
  5. SVN工作笔记003---svn文件被别人锁定,而那人又把锁定的文件删除了,解锁办法
  6. 线程属性pthread_attr_t简介-转
  7. Linux服务器部署javaweb项目,从环境配置,到最终系统运行
  8. 阿里矢量图标引入方法
  9. 软考信息系统项目管理师知识点总结1
  10. 思科路由器配置命令(一)
  11. java dom4j解析复杂xml成json
  12. Acwing:奶牛慢跑(单调栈 Python)
  13. LAMP系列文章之:泛泛而谈LAMP(一)
  14. 机票预订系统活动图_机票预订ppt
  15. 数据库重构工具 LiquiBase(5 Liquibase被锁)
  16. java对象上有横线_对象bean间属性值复制:无视大小写和下划线_和横杠-
  17. java jacob ocx_JAVA通过jacob调用ocx
  18. RXD、TXD你接错了没?
  19. Go版GTK:环境搭建(windows)
  20. 一款好用的json解析工具,JsonPath。

热门文章

  1. 相当于jQuery .hide()来设置可见性:隐藏
  2. 如何编写内联if语句用于打印?
  3. 将java.util.Date转换为java.time.LocalDate
  4. 将参数传递给Bash函数
  5. win11鼠标指针如何设置 Windows11鼠标指针的设置方法
  6. 超简单的内网邮件服务器搭建(CentOS7 postfix+dovecot)
  7. swagger隐藏实体类字段_你还在用 Swagger?试试这个神器!
  8. 全向轮机器人应用平台
  9. html在文本框选中后在表格中选中,excel表格出现文本框的解决方法步骤
  10. c语言以空格分割字符串,C语言程序要读入一行文本,以空格分隔若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。...