榨汁机-反射-多态-重载实验
1台榨汁机
水果:Apple,Orange,Banana
一.最原始情况
1.每个水果一个类,类下一个榨汁方法
2.榨汁机一个类,类下有一个方法,可以调用水果的榨汁方法
代码如下
public static void main(String[] args) {
Juicer myJuicer=new Juicer();
myJuicer.run(new Apple());
}
class Apple{
public void squeeze(){
System.out.println("榨出一杯苹果汁");
}
}
class Orange{
public void squeeze(){
System.out.println("榨出一杯橘子汁");
}
}
class Juicer{
public void run(Apple a){
a.squeeze();
}
}
4.分析问题
如果想从榨苹果换成榨橘子
如果想要从苹果换成橘子,要修改Juicer类下传入的水果
还要修改main函数中传入给Juicer的苹果
也就是需要修改两处代码
使用多态优化后,如下
二.多态优化后
1.榨汁机只要管放入榨汁机的是个水果就行,我就榨这个传进来的水果
2.让苹果橘子全都继承水果这个接口,实现榨汁方法就行
3.这样想要从苹果换成橘子,只要修改main函数中传入榨汁机的水果的就行
代码如下
public static void main(String[] args) {
Juicer myJuicer=new Juicer();
myJuicer.run(new Orange());
}
interface Fruit{
public void squeeze();
}
class Apple implements Fruit{
public void squeeze(){
System.out.println("榨出一杯苹果汁");
}
}
class Orange implements Fruit{
public void squeeze(){
System.out.println("榨出一杯橘子汁");
}
}
class Juicer{
public void run(Fruit f){
f.squeeze();
}
4.问题分析
我们觉得直接修改代码还是不太好,连main函数中的代码都不想修改
具体优化如下第三种方式所示
三.用修改配置文件的方法完成榨汁机水果的切换,完全不去修改代码
这个时候,我们需要用到 class.forName("")方法,拿到水果类的字节码文件
再用这个字节码文件新建水果实例
public static void main(String[] args) throws Exception {
Juicer myJuicer=new Juicer();
BufferedReader br=new BufferedReader(new FileReader("config.properties"));
Class clazz=Class.forName(br.readLine());
myJuicer.run((Fruit)clazz.newInstance());
}
这个config.properties是新建的文本文件
通过修改配置文件中的类名,直接可以控制榨汁机榨出来的是苹果汁还是橘子汁
而不用再去修改代码
就像把代码看成是一个黑盒,我们只要盯着配置文件修改需求,而不用了解黑盒中的内容