所谓的混型就是让多个类的特性集中到一个类的上面,在java中主要有两种方案来针对这个问题,第一个是用接口,第二种使用动态代理的方式,如果使用第一种方式而且构造的对象模型非常复杂的话,那么对象的层次结构也将变的复杂,第二种方式显的更有灵活性,下面是两种方案的代码
package com.eric.generic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class MixinSolution {
public static void main(String[] args) {
/*
* use interface to produce effect of mixing, to make EleWatch have
* Watch,Clock Calendar functions
*/
EleWatch ew = new EleWatch();
ew.calendar();
ew.clock();
ew.printTime();
/*
* use dynamic proxy to produce effect of mixing
*/
Object mixing = MixinHandler.newInstance(new Tuple2(new ClockImp(), Clock.class), new Tuple2(new CalendarImp(), Calendar.class));
Clock clock = (Clock) mixing;
clock.clock();
Calendar calendar = (Calendar) mixing;
calendar.calendar();
}
}
// ............................................dynamic proxy
class MixinHandler implements InvocationHandler {
private static Map<String, Object> delegateMethod = new HashMap<String, Object>();
private MixinHandler(Tuple2<Object, Class<?>>... paris) {
}
private static void initDelegateMethods(Tuple2<Object, Class<?>>... paris) {
for (Tuple2<Object, Class<?>> tuple2 : paris) {
for (Method method : tuple2.b.getMethods()) {
String methodName = method.getName();
if (!delegateMethod.containsKey(methodName)) {
// put method name as key, Object as value in deledateMethod
// map
delegateMethod.put(methodName, tuple2.a);
}
}
}
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before invoke");
String methodName = method.getName();
Object delegate = delegateMethod.get(methodName);
if (delegate != null) {
return method.invoke(delegate, args);
} else {
throw new RuntimeException("method not found!");
}
}
public static Object newInstance(Tuple2<Object, Class<?>>... pairs) {
initDelegateMethods(pairs);
Class<?>[] interfaces = new Class [pairs.length];
int count = 0;
for (Tuple2<Object, Class<?>> tuple2 : pairs) {
interfaces[count++] = tuple2.b;
}
return Proxy.newProxyInstance(interfaces[0].getClassLoader(), interfaces, new MixinHandler());
}
}
// ............................................interface
interface Clock {
public void clock();
}
class ClockImp implements Clock {
public void clock() {
System.out.println("Clocking....");
}
}
interface Calendar {
public void calendar();
}
class CalendarImp implements Calendar {
public void calendar() {
System.out.println("Calending....");
}
}
interface Timer {
public void printTime();
}
class Watch implements Timer {
public void printTime() {
System.out.println(new Date());
}
}
/*
* use interface to produce effect of mixing, to make EleWatch have Watch,Clock
* Calendar functions
*/
class EleWatch extends Watch implements Clock, Calendar {
private Clock clock = new ClockImp();
private Calendar calendar = new CalendarImp();
public void calendar() {
calendar.calendar();
}
public void clock() {
clock.clock();
}
}
分享到:
相关推荐
java系统软件技术架构设计方案(案例).docxjava系统软件技术架构设计方案(案例).docxjava系统软件技术架构设计方案(案例).docxjava系统软件技术架构设计方案(案例).docxjava系统软件技术架构设计方案(案例).docxjava...
一个java后台程序的解决方案设计(真实项目)
java持久化的解决方案,java持久化的解决方案
精通轻量级Java EE 框架整合方案,光盘资料
HZS60演示程序(混凝土搅拌站用)模拟
Groovy环境搭建教程中的例子工程,纯Java、纯Groovy以及Java+Groovy混合 教程参考:http://blog.csdn.net/rcom10002/archive/2011/06/26/6568557.aspx
java软件架构设计方案.pdf
java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)...
java实现国际化中英文语言切换 java语言切换JSP国际化 java实现国际化中英文语言切换 java语言切换JSP国际化
第一章 Java语言的产生及其特点 第二章 Java程序开发与运行环境 第三章 Java程序设计基础 第四章 Java应用程序的基本框架 第五章 Java的类 第六章 Java图形用户接口 第七章 多线程 第八章 Java的"异常" 第九...
JAVA报表解决方案源码
ElasticSearch Java API 中文文档 ElasticSearch Java API 中文文档
JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷歌翻译,非人工翻译。准确性不能保证,请与英文版配合使用 ...
java实现中文排序,按数字字母汉字的顺序进行排序
该代码提供了word、excel、pdf三种类型的文档生成方案,其中word文档使用“freemarker + xml + 模板”技术;excel使用“POI + 模板”技术;pdf使用“freemarker + itext + flying saucer”技术
java.security.InvalidKeyException: Illegal key size 解决方案
Head First Java 中文高清版Head First Java 中文高清版Head First Java 中文高清版
java解决大批量数据导出Excel产生内存溢出的方案
工业制造、混凝土、源码、java、多线程、mybatis、部署即可使用、仅用于学习使用,禁止用于商业
Java文件同步开源项目Sync 使用简单的命令即可完成文件系统的同步,可以在其上自己包装业务 含源码和jar