`
numen06
  • 浏览: 76025 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JAVA设计模式之装饰模式,封装父类,提供转换接口

阅读更多
在开发过程中很多时候都需要用到装饰器。
所以在实体之上建立一层装饰层更有利于装饰封装对外开放方法。
此类有利于对实体的完整保留并对其属性get,set进行开放,
提供相应的从实体转换到装饰器,和list的常用装换。

package com.wesley.framework.decoration;

import java.util.Collection;
import java.util.List;

public interface Decoration<Model, Decor extends Decorator<Model>> {

	public List<Decor> baseExchange(Collection<Model> models);

	public Decor baseExchange(Model model);

}

package com.wesley.framework.decoration;

public interface Decorator<T> extends java.io.Serializable {

	public void setModel(T model);

	//public T getModel();
}

package com.wesley.framework.decoration;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import com.wesley.framework.commen.GenericsUtils;

@SuppressWarnings("serial")
public abstract class DecoratorModel<Model, Decor extends Decorator<Model>>
		implements Decorator<Model>, Decoration<Model, Decor> {

	protected Model model;

	/**
	 * 装饰器构造函数,如果没有自动创建一个实体
	 */
	@SuppressWarnings("unchecked")
	public DecoratorModel() {
		super();
		try {
			Class<?> cls = GenericsUtils.getSuperClassGenricType(
					this.getClass(), 0);
			this.setModel((Model) cls.newInstance());
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @param model
	 *            将实体封装进入装饰器
	 */
	public DecoratorModel(Model model) {
		super();
		this.model = model;
	}

	// @Override
	// public Model getModel() {
	// return model;
	// }

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.wesley.framework.decoration.Decorator#setModel(java.lang.Object)
	 * 装饰器接口,将Model注入到装饰器中
	 */
	@Override
	public void setModel(Model model) {
		this.model = model;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.wesley.framework.decoration.Decoration#baseExchange(java.lang.Object)
	 * 
	 * 反射必有参数构造函数,将实体包含在装饰器之中
	 */
	@SuppressWarnings("unchecked")
	@Override
	public Decor baseExchange(Model model) {
		Decor decor = null;
		try {
			decor = (Decor) this.getClass().getConstructor(model.getClass())
					.newInstance(model);
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
		decor.setModel(model);
		return decor;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.wesley.framework.decoration.Decoration#baseExchange(java.util.Collection
	 * 转换List等Collection接口数据
	 */
	@Override
	public List<Decor> baseExchange(Collection<Model> models) {
		List<Decor> decorList = new ArrayList<Decor>();
		for (Model model : models) {
			decorList.add(this.baseExchange(model));
		}
		return decorList;
	}

}

package com.wesley.framework.commen;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * 泛型工具类
 * 
 * @author lihuoming
 * 
 */
@SuppressWarnings("rawtypes")
public class GenericsUtils {
	/**
	 * 通过反射,获得指定类的父类的泛型参数的实际类型. 如BuyerServiceBean extends DaoSupport<Buyer>
	 * 
	 * @param clazz
	 *            clazz 需要反射的类,该类必须继承范型父类
	 * @param index
	 *            泛型参数所在索引,从0开始.
	 * @return 范型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
	 *         <code>Object.class</code>
	 */
	public static Class getSuperClassGenricType(Class clazz, int index) {
		Type genType = clazz.getGenericSuperclass();// 得到泛型父类
		// 如果没有实现ParameterizedType接口,即不支持泛型,直接返回Object.class
		if (!(genType instanceof ParameterizedType)) {
			return Object.class;
		}
		// 返回表示此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class, 如BuyerServiceBean extends
		// DaoSupport<Buyer,Contact>就返回Buyer和Contact类型
		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
		if (index >= params.length || index < 0) {
			throw new RuntimeException("你输入的索引"
					+ (index < 0 ? "不能小于0" : "超出了参数的总数"));
		}
		if (!(params[index] instanceof Class)) {
			return Object.class;
		}
		return (Class) params[index];
	}

	/**
	 * 通过反射,获得指定类的父类的第一个泛型参数的实际类型. 如BuyerServiceBean extends DaoSupport<Buyer>
	 * 
	 * @param clazz
	 *            clazz 需要反射的类,该类必须继承泛型父类
	 * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
	 *         <code>Object.class</code>
	 */
	public static Class getSuperClassGenricType(Class clazz) {
		return getSuperClassGenricType(clazz, 0);
	}

	/**
	 * 通过反射,获得方法返回值泛型参数的实际类型. 如: public Map<String, Buyer> getNames(){}
	 * 
	 * @param method
	 *            方法
	 * @param index
	 *            泛型参数所在索引,从0开始.
	 * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
	 *         <code>Object.class</code>
	 */
	public static Class getMethodGenericReturnType(Method method, int index) {
		Type returnType = method.getGenericReturnType();
		if (returnType instanceof ParameterizedType) {
			ParameterizedType type = (ParameterizedType) returnType;
			Type[] typeArguments = type.getActualTypeArguments();
			if (index >= typeArguments.length || index < 0) {
				throw new RuntimeException("你输入的索引"
						+ (index < 0 ? "不能小于0" : "超出了参数的总数"));
			}
			return (Class) typeArguments[index];
		}
		return Object.class;
	}

	/**
	 * 通过反射,获得方法返回值第一个泛型参数的实际类型. 如: public Map<String, Buyer> getNames(){}
	 * 
	 * @param method
	 *            方法
	 * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
	 *         <code>Object.class</code>
	 */
	public static Class getMethodGenericReturnType(Method method) {
		return getMethodGenericReturnType(method, 0);
	}

	/**
	 * 通过反射,获得方法输入参数第index个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String,
	 * Buyer> maps, List<String> names){}
	 * 
	 * @param method
	 *            方法
	 * @param index
	 *            第几个输入参数
	 * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回空集合
	 */
	public static List<Class> getMethodGenericParameterTypes(Method method,
			int index) {
		List<Class> results = new ArrayList<Class>();
		Type[] genericParameterTypes = method.getGenericParameterTypes();
		if (index >= genericParameterTypes.length || index < 0) {
			throw new RuntimeException("你输入的索引"
					+ (index < 0 ? "不能小于0" : "超出了参数的总数"));
		}
		Type genericParameterType = genericParameterTypes[index];
		if (genericParameterType instanceof ParameterizedType) {
			ParameterizedType aType = (ParameterizedType) genericParameterType;
			Type[] parameterArgTypes = aType.getActualTypeArguments();
			for (Type parameterArgType : parameterArgTypes) {
				Class parameterArgClass = (Class) parameterArgType;
				results.add(parameterArgClass);
			}
			return results;
		}
		return results;
	}

	/**
	 * 通过反射,获得方法输入参数第一个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String, Buyer>
	 * maps, List<String> names){}
	 * 
	 * @param method
	 *            方法
	 * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回空集合
	 */

	public static List<Class> getMethodGenericParameterTypes(Method method) {
		return getMethodGenericParameterTypes(method, 0);
	}

	/**
	 * 通过反射,获得Field泛型参数的实际类型. 如: public Map<String, Buyer> names;
	 * 
	 * @param field
	 *            字段
	 * @param index
	 *            泛型参数所在索引,从0开始.
	 * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
	 *         <code>Object.class</code>
	 */
	public static Class getFieldGenericType(Field field, int index) {
		Type genericFieldType = field.getGenericType();

		if (genericFieldType instanceof ParameterizedType) {
			ParameterizedType aType = (ParameterizedType) genericFieldType;
			Type[] fieldArgTypes = aType.getActualTypeArguments();
			if (index >= fieldArgTypes.length || index < 0) {
				throw new RuntimeException("你输入的索引"
						+ (index < 0 ? "不能小于0" : "超出了参数的总数"));
			}
			return (Class) fieldArgTypes[index];
		}
		return Object.class;
	}

	/**
	 * 通过反射,获得Field泛型参数的实际类型. 如: public Map<String, Buyer> names;
	 * 
	 * @param field
	 *            字段
	 * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
	 *         <code>Object.class</code>
	 */
	public static Class getFieldGenericType(Field field) {
		return getFieldGenericType(field, 0);
	}
}
2
0
分享到:
评论

相关推荐

    重学java的设计模式

    Java作为一门广泛应用的开发语言,其设计模式的应用对于提高代码质量、可维护性和可扩展性至关重要。本文将着重探讨创建型模式、结构型模式和行为模式这三大类设计模式,并结合六项设计原则进行深入解析。 首先,...

    java设计模式并附带源码

    本资源“java设计模式并附带源码”提供了一种深入理解并实践Java设计模式的方式,通过源码实例帮助开发者更直观地学习和掌握这些模式。 首先,我们要了解设计模式的基本分类,它们主要分为三类:创建型模式...

    java 设计模式 一个txt 一个pdf

    Java设计模式是软件开发中...总之,这份"java设计模式.pdf"和"java设计模式.txt"的组合为Java开发者提供了一份宝贵的参考资料,通过学习和实践这些设计模式,开发者能够写出更优雅、更高效的代码,提升自己的编程技能。

    java软件设计模式期末总结

    Java软件设计模式是软件开发中的重要概念,它们是经过时间考验的最佳实践,旨在解决常见的设计问题,提高代码的可读性、可维护性和可扩展性。以下是对标题和描述中涉及的一些关键知识点的详细说明: 1. **单一职责...

    java设计模式源码

    Java设计模式源码集合了23种经典的设计模式,为高级Java开发者提供了深入理解这些模式的实际应用。下面,我们将详细探讨这些设计模式及其在Java中的实现。 1. **单例模式(Singleton)**:保证一个类只有一个实例,...

    java设计模式.chm

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以被复用在各种不同的软件开发环境中。这些模式描述了在特定情况下,如何组织代码以解决常见问题,提高代码的可读性、可维护性和可...

    23种设计模式的Java实现

    设计模式是软件工程中经过长期实践总结出的通用解决方案,它们是...以上23种设计模式在Java实现中,通常涉及面向对象的特性,如继承、多态、封装等。理解并熟练应用这些模式,有助于编写出更加灵活、易于维护的代码。

    转帖经典---JAVA设计模式

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和最佳实践。这些模式为程序员提供了一种标准化的方式,以便在面向对象编程中有效地组织和构建代码,提高代码的可读性、可维护性和...

    23种设计模式实现designpattern书籍代码的重写Java版

    本资源提供了《设计模式:可复用面向对象软件的基础》(GOF设计模式)书籍中23种设计模式的Java实现重写版本。下面将对这23种设计模式进行详细解释,并结合提供的文件名来推测每种模式的示例应用。 1. **单例模式...

    JAva 2009 设计模式

    通过学习这些材料,你可以掌握Java设计模式的基本理念,学会如何在实际开发中有效地运用它们,以优化代码结构,提升代码的可读性和可维护性。设计模式的掌握有助于你成为一名更优秀的Java开发者,解决复杂的问题并...

    java26个设计模式

    Java设计模式是面向对象编程中的一种最佳实践,用于解决常见的设计问题并促进代码的可重用性和可维护性。总共有23种官方定义的设计模式,这些模式被分为三类:创建型、结构型和行为型。以下是这些设计模式的详细说明...

    Java设计模式

    ### Java设计模式详解 在软件开发领域,设计模式是一种经过验证的解决方案,它提供了一种通用的方法来解决常见的设计问题。对于Java开发者来说,掌握设计模式尤为重要,因为它们能够帮助开发者编写出更易于维护和...

    java设计模式java设计模式.pdf

    根据提供的信息,我们可以总结出以下关于Java设计模式的相关知识点: ### Java设计模式概览 Java设计模式是一套被广泛认可的、经过验证的解决方案,用于解决软件开发过程中遇到的常见问题。这些模式可以帮助开发者...

    java 设计模式-个人总结

    ### Java设计模式——个人总结 #### 一、概述 本文档总结了常见的Java设计模式及其应用,涵盖了十种经典的设计模式,并提供了相应的代码示例。这些设计模式旨在解决软件开发过程中遇到的一系列常见问题,帮助...

    java设计模式

    Java设计模式则是在Java语言层面上实现这些设计模式的具体应用。设计模式不仅能够提高代码的可复用性、可维护性,还能提升系统的灵活性和扩展性。本知识点将详细介绍Java中常用的设计模式及其在实际中的应用示例。 ...

    java设计模式之面向对象的思想(think in OO(Object Oriented))

    这篇博客将深入探讨面向对象的思想及其在Java设计模式中的应用。 首先,我们理解面向对象的基本概念: 1. 封装(Encapsulation):封装是将数据和操作这些数据的方法捆绑在一起,形成一个独立的单元——对象。这样...

    23种设计模式的java实现

    Java作为广泛应用的编程语言,自然也融入了这23种设计模式。这些模式可以帮助开发者写出可扩展、可维护且具有良好结构的代码。接下来,我们将详细探讨每一种设计模式及其在Java中的实现。 1. **单例模式**:确保一...

    JavaDesignPatternNew_java设计模式_a282acom_complete1cj_源码

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结,能够提升代码的可读性、可维护性和复用性。在这个名为"JavaDesignPatternNew_java设计模式_a282acom_complete1cj_源码"的压缩包...

Global site tag (gtag.js) - Google Analytics