Java中的委托模式
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中的委托模式相关推荐
- Java中特质模式的定义
在本文中,我将介绍特征的概念,并为您提供一个如何在Java中使用它们以在对象设计中减少冗余的具体示例. 我将首先提出一个虚构的案例,其中可以使用特征来减少重复,然后以使用Java 8的特征模式示例实现 ...
- Java笔记-Java中桥接模式
最近在研究一个APP,逆向后发现貌似用了桥接模式,特意学习了下Java中的桥接模式. 关于C++的桥接链接如下: https://blog.csdn.net/qq78442761/article/de ...
- Java笔记-Java中备忘录模式
首先设计模式代表外招功法,是外招的模板,个人觉得他是为面向对象7个原则而准备的: 面向对象程序设计要考虑7个原则: 单一职责原则:设计目的单一的类: 开放封闭原则:对扩展开发,对修改封闭: 李氏替换原 ...
- java中KMP模式,Java数据结构-串及其应用-KMP模式匹配算法
串(string)是由零个或多个宇符组成的有限序列,又名叫字符串. 定义的解释: ??串中的字符数目n称为串的长度,定义中谈到"有限"是指长度n是一个有限的数值. ??零个字符的串 ...
- Java中的模式 --- 命令模式
一,命令模式的实现: 命令模式里边一般都有以下几个角色:客户端,请求者,命令接口,命令实现,接受者, 下边是简单命令模式的实现代码实现: 1 public class Client{ 2 ...
- java中mvc模式是什么_什么是MVC模式 MVC模式中三者之间关系
MVC模式设计的初衷是,一旦一个项目的代码量变大的时候,src文件夹中可以写java代码,web文件夹中也可以写jsp代码.除此之外src中还可以写好多包,web文件夹中还可以写好多文件夹,现在假如新 ...
- Java中的委托和继承(Delegation and Inheritance)
写在前面 概念 Delegation(委托) 委派的几种类型归纳 Dependency(依赖): 临时性的delegation Association(关联): 永久性的delegation Comp ...
- java中装潢模式_JAVA中的设计模式四(装饰模式)
-------装饰模式 装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建 ...
- java中KMP模式_朴素模式匹配算法、kmp模式匹配算法、kmp模式匹配算法改进。java代码...
** 朴素模式匹配算法.kmp模式匹配算法.kmp模式匹配算法改进.java代码** 思路过段时间整理~ 可以先看看阮一峰的这篇博客,字符串匹配的KMP算法 package edu.hubu.base ...
最新文章
- php,cgi,nginx关系
- GitHub上那些值得一试的JAVA开源库--转
- 科研实习 | 北京大学智能学院贺笛老师招收NLP/GNN方向科研实习生
- 一、spring mvc简介
- SVN工作笔记003---svn文件被别人锁定,而那人又把锁定的文件删除了,解锁办法
- 线程属性pthread_attr_t简介-转
- Linux服务器部署javaweb项目,从环境配置,到最终系统运行
- 阿里矢量图标引入方法
- 软考信息系统项目管理师知识点总结1
- 思科路由器配置命令(一)
- java dom4j解析复杂xml成json
- Acwing:奶牛慢跑(单调栈 Python)
- LAMP系列文章之:泛泛而谈LAMP(一)
- 机票预订系统活动图_机票预订ppt
- 数据库重构工具 LiquiBase(5 Liquibase被锁)
- java对象上有横线_对象bean间属性值复制:无视大小写和下划线_和横杠-
- java jacob ocx_JAVA通过jacob调用ocx
- RXD、TXD你接错了没?
- Go版GTK:环境搭建(windows)
- 一款好用的json解析工具,JsonPath。
热门文章
- 相当于jQuery .hide()来设置可见性:隐藏
- 如何编写内联if语句用于打印?
- 将java.util.Date转换为java.time.LocalDate
- 将参数传递给Bash函数
- win11鼠标指针如何设置 Windows11鼠标指针的设置方法
- 超简单的内网邮件服务器搭建(CentOS7 postfix+dovecot)
- swagger隐藏实体类字段_你还在用 Swagger?试试这个神器!
- 全向轮机器人应用平台
- html在文本框选中后在表格中选中,excel表格出现文本框的解决方法步骤
- c语言以空格分割字符串,C语言程序要读入一行文本,以空格分隔若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。...