反射综合案例 - 举办晚会
说明 : 通过反射读取配置文件中的信息, 动态使用工厂设计模式, 创建配置文件中的对应类对象, 在使用对象调用接口中的对应方法实现对应的业务逻辑, 具体显示结果输出,配置文件设置,代码实现如下 :
显示结果1
晚会开始了...
张学友演唱 一路上有你!
少女时代跳 Gee Gee Gee!
赵本山表演 卖拐!
难玩今宵!
显示结果2
晚会开始了...
刘德华演唱 爱你一万年!
少女团队跳 性感广场舞!
刘谦表演 大变活人!
难玩今宵!
配置文件
说明 :
配置文件的路径在项目的根路径下. 注意包名cn.i
和类名如: LiuDeHua
的定义. 不要出现错误!
定义三个接口
作用 :
在程序中使用接口来进行解耦.
Dancable
public interface Dancable { void dance(); }Singable
public interface Singable { void sing(); }Performable
public interface Performable { void perform(); }定义一个工厂类
说明 :
在工厂类中, 提供三个返回接口实现类对象的方法, 工厂类的作用主要是负责创建调用者需要的对象, 工厂类创建的对象是从配置文件中获取类的权限定名称来创建的. 因为, 配置文件中的类如果发生了修改, 那么使用工厂类创建出来的类也会随之改变. 这样就可以实现代码的灵活性与高度程序解耦性.
定义具体的接口实现类
ZhangXueYou
public class ZhangXueYou implements Singable { @Override public void sing() { Sy("张学友 演唱 一路上有你."); } }GirlsGeneration
public class GirlsGeneration implements Dancable { @Override public void dance() { Sy("少女时代 跳 Gee Gee Gee."); } }ZhaoBenShan
public class ZhaoBenShan implements Performable { @Override public void perform() { Sy("赵本山 表演 卖拐."); } }说明 :
三个接口对应的实现类已经完成!
创建一个测试类
public class EveningPartyDemo { public static void main(String[] args) throws Exception { Sy("晚会开始了..."); // 歌曲 Singable s = Par(); s.sing(); // 舞蹈 Dancable d = Par(); d.dance(); // 表演 Performable p = Par(); p.perform(); Sy("难忘今宵!"); } }说明 :
执行程序, 即可看到效果1所示.
再创建三个不同的接口实现类
LiuDeHua
public class LiuDeHua implements Singable { @Override public void sing() { Sy("刘德华 演唱 爱你一万年."); } }GirlsTeam
public class GirlsTeam implements Dancable { @Override public void dance() { Sy("少女团队 跳 性感广场舞."); } }LiuQian
public class LiuQian implements Performable { @Override public void perform() { Sy("刘谦 表演 大变活人."); } }说明 :
执行测试程序, 将配置文件中的接口实现类进行相对应的修改, 就可以看到结果2所示.
总结 :
在程序中, 工厂类 + 配置文件是程序实现高解耦和扩展性的最重要基础. 而工厂类要实现配置文件的读取, 需要依赖与Java语法中的反射机制, 通过读取文件的权限定类名动态创建对应的对象, 从而执行程序的逻辑业务. 因此, 通过一个小小的案例, 相信大家能够更好的理解反射的使用场景与其在程序中所起到的关键性作用.