设计模式之对反射的理解

1. 第二点是直接从度娘那里Copy过来的,看了几遍,云里雾里,我只能说这个机制描述的真的很高深。

2. C#和Java是支持反射的,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

3. 之前学习设计模式之简单工厂时,记得Factory类里面的Create()方法用的是一个switch&case,像下面这样根据这个char c来创建对象:


class SimpleFactory  
{  
public:  
	Operator* CreateOperator(char c)  
	{  
		Operator* oper = NULL;  
		switch (c)  
		{  
		case '+':  
			oper = new OperatorAdd();  
			break;  
		case '-':  
			oper = new OperatorSub();  
			break;  
		case '*':  
			oper = new OperatorMul();  
			break;  
		case '/':  
			oper = new OperatorDiv();  
			break;  
		default:  
			break;  
		}  
		return oper;  
	}  
}; 

但是这样有一个不符合“开放-封闭”原则的地方,如果现在要增加一个新的运算符对象求余(OperatorMod),就得修改SimpleFactory的CreateOperator方法了,在里面增加一个case ‘%’,如何解决这个问题,用反射。

4. 如果CreateOperator()可以像下面这样,就不需要增加一个case '%'了。那这里反射便是:根据这个传递的className就可以构造出这个对象,亦即在运行时只要根据这个className我便可以动态的构建任意一个对象。


#define NEW_OBJECT(className) new className;

Operator* CreateOperator(char* className)  
{  
    Operator* oper = NULL;  
    oper = NEW_OBJECT(className);
}

5. 当然以上的NEW_OBJECT还过于简单. 猛地想到《深入浅出MFC》MFC六大关键技术之Dynamic Create(动态创建),这不就是反射嘛,原来搞了半天“反射”就是这么个东西,名字挺忽悠人的,云里雾里。

posted @ 2012-06-12 16:02  $逝水无痕$  阅读(720)  评论(0编辑  收藏  举报