设计模式之对反射的理解
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(动态创建),这不就是反射嘛,原来搞了半天“反射”就是这么个东西,名字挺忽悠人的,云里雾里。
不积跬步无以至千里,不积小流无以成江河。