黑马程序员技术交流社区

标题: 【上海校区】反射综合案例 - 举办晚会 [打印本页]

作者: 小影姐姐    时间: 2018-4-18 10:58
标题: 【上海校区】反射综合案例 - 举办晚会
本帖最后由 上海分校-小影 于 2018-4-18 11:03 编辑

反射综合案例 - 举办晚会
说明 : 通过反射读取配置文件中的信息, 动态使用工厂设计模式, 创建配置文件中的对应类对象, 在使用对象调用接口中的对应方法实现对应的业务逻辑, 具体显示结果输出,配置文件设置,代码实现如下 :
显示结果1
  • 晚会开始了...
  • 张学友演唱 一路上有你!
  • 少女时代跳 Gee Gee Gee!
  • 赵本山表演 卖拐!
  • 难玩今宵!

显示结果2
  • 晚会开始了...
  • 刘德华演唱 爱你一万年!
  • 少女团队跳 性感广场舞!
  • 刘谦表演 大变活人!
  • 难玩今宵!

配置文件
party.properties
说明 : 配置文件的路径在项目的根路径下. 注意包名cn.itcast.party和类名如: LiuDeHua的定义. 不要出现错误!
[AppleScript] 纯文本查看 复制代码
#singable=cn.itcast.party.LiuDeHua
#dancable=cn.itcast.party.GirlsTeam
#performable=cn.itcast.party.LiuQian
singable=cn.itcast.party.ZhangXueYou
dancable=cn.itcast.party.GirlsGeneration
performable=cn.itcast.party.ZhaoBenShan
定义三个接口
作用 : 在程序中使用接口来进行解耦.
Dancable
[AppleScript] 纯文本查看 复制代码
public interface Dancable {
void dance();
}
Singable
[AppleScript] 纯文本查看 复制代码
public interface Singable {
void sing();
}
Performable
[AppleScript] 纯文本查看 复制代码
public interface Performable {
void perform();
}
定义一个工厂类
说明 : 在工厂类中, 提供三个返回接口实现类对象的方法, 工厂类的作用主要是负责创建调用者需要的对象, 工厂类创建的对象是从配置文件中获取类的权限定名称来创建的. 因为, 配置文件中的类如果发生了修改, 那么使用工厂类创建出来的类也会随之改变. 这样就可以实现代码的灵活性与高度程序解耦性.
[AppleScript] 纯文本查看 复制代码
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class PartyFactory {
// 属性集对象
private static Properties prop = new Properties();
// 静态代码块, 加载配置文件信息
static {
try {
prop.load(new FileReader("party.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
// 返回 Singable 实现类对象的方法
public static Singable getSingable() throws Exception {
String className = prop.getProperty("singable");
Class<?> cls = Class.forName(className);
return (Singable) cls.newInstance();
}
// 返回 Dancable 实现类对象的方法
public static Dancable getDancable() throws Exception {
String className = prop.getProperty("dancable");
Class<?> cls = Class.forName(className);
return (Dancable) cls.newInstance();
}
// 返回 Performable 实现类对象的方法
public static Performable getPerformable() throws Exception {
String className = prop.getProperty("performable");
Class<?> cls = Class.forName(className);
return (Performable) cls.newInstance();
}
}
定义具体的接口实现类
ZhangXueYou
[AppleScript] 纯文本查看 复制代码
public class ZhangXueYou implements Singable {
@Override
public void sing() {
System.out.println("张学友 演唱 一路上有你.");
}
}
GirlsGeneration
[AppleScript] 纯文本查看 复制代码
public class GirlsGeneration implements Dancable {
@Override
public void dance() {
System.out.println("少女时代 跳 Gee Gee Gee.");
}
}
ZhaoBenShan
[AppleScript] 纯文本查看 复制代码
public class ZhaoBenShan implements Performable {
@Override
public void perform() {
System.out.println("赵本山 表演 卖拐.");
}
}
说明 : 三个接口对应的实现类已经完成!
创建一个测试类
[AppleScript] 纯文本查看 复制代码
public class EveningPartyDemo {
public static void main(String[] args) throws Exception {
System.out.println("晚会开始了...");
// 歌曲
Singable s = PartyFactory.getSingable();
s.sing();
// 舞蹈
Dancable d = PartyFactory.getDancable();
d.dance();
// 表演
Performable p = PartyFactory.getPerformable();
p.perform();
System.out.println("难忘今宵!");
}
}
说明 : 执行程序, 即可看到效果1所示.
再创建三个不同的接口实现类
LiuDeHua
[AppleScript] 纯文本查看 复制代码
public class LiuDeHua implements Singable {
@Override
public void sing() {
System.out.println("刘德华 演唱 爱你一万年.");
}
}
GirlsTeam
[AppleScript] 纯文本查看 复制代码
public class GirlsTeam implements Dancable {
@Override
public void dance() {
System.out.println("少女团队 跳 性感广场舞.");
}
}
LiuQian
[AppleScript] 纯文本查看 复制代码
public class LiuQian implements Performable {
@Override
public void perform() {
System.out.println("刘谦 表演 大变活人.");
}
}
说明 : 执行测试程序, 将配置文件中的接口实现类进行相对应的修改, 就可以看到结果2所示.
总结 :
在程序中, 工厂类 + 配置文件是程序实现高解耦和扩展性的最重要基础. 而工厂类要实现配置文件的读取, 需要依赖与Java语法中的反射机制, 通过读取文件的权限定类名动态创建对应的对象, 从而执行程序的逻辑业务. 因此, 通过一个小小的案例, 相信大家能够更好的理解反射的使用场景与其在程序中所起到的关键性作用.














欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2