先说一个场景: 电脑运行的场景 , 我写简单明了一点!!
1. 想象电脑开始运行就是执行main方法,就开始运行了。
public static void main (String[] args){
// 模拟启动电脑的过程
主板 主板1 = new 主板();
主板1.主板运行();
}
2. 想象主板开始运行的类(注意:主板上可以加声卡,网卡,显卡,内存条等很多功能,这一点很重要。)
public class 主板 {
public void 主板运行(){
}
public void 主板关机(){
}
}
现在不同了, 我电脑开机后,我又想上网,听音乐了。怎么办呢 ?
接着就是加代码,改代码呗。对吧。 我现在想上网,听音乐。好,创建2个类,分别是上网,听音乐。
3. 想象开始上网的类;
public class 网卡 {
public void 网卡运行开始上网(){
}
public void 网卡关机停止上网(){
}
}
4. 想象开始听音乐的类;
public class 声卡 {
public void 声卡运行听音乐(){
}
public void 声卡关机静音了(){
}
}
既然想要上网听音乐,那么就要开始改主板的代码了。 给主板加功能。
public class 主板 {
public void 主板运行(){
}
public void 主板关机(){
}
public void 网卡(status s) {
if(s==1){
网卡 网卡1 = new 网卡();
网卡1.网卡运行开始上网();
}else {
网卡 网卡1 = new 网卡();
网卡1.网卡关机停止上网();
}
}
public void 声卡(status s) {
if(s==1){
声卡 声卡1 = new 声卡();
声卡1.声卡运行听音乐();
}else {
声卡 声卡1 = new 声卡();
声卡1.声卡关机静音了();
}
}
}
最后,我们运行电脑程序即可让电脑能开机,上网,听音乐
public static void main (String[] args){
// 模拟启动电脑的过程
主板 主板1 = new 主板();
主板1.主板运行();
主板1.网卡(1);
主板1.声卡(1);
}
接下来,就是解决上面遇到的问题(耦合度太高):
写到现在,大家发现问题了没有 ? 主板上可以添加功能。但是功能有成千上万个。
是不是每次给主板加功能,换功能的时候都要重写编写代码呢 ? 太麻烦了。这是一个很大的问题,耦合度太高。
接着,我想到了一个方法。我自己对外创建一个接口。
名字叫: 外设部件互连标准,作用是无论添加什么功能,这个功能要么开启要么关闭
public interface 外设部件互连标准 {
public void open();
public void close();
}
这时候我就不管电脑要加哪些功能了。
我们先给电脑创建2个功能。声卡、网卡
添加声卡功能:
public class 声卡 implements 外设部件互连标准 {
public void open(){
System.out.println("声卡运行听音乐");
}
public void close(){
System.out.println("声卡关机静音了");
}
}
添加网卡功能:
public class 网卡 implements 外设部件互连标准 {
public void open(){
System.out.println("网卡运行开始上网");
}
public void close(){
System.out.println("网卡关机停止上网");
}
}
编写同意运行电脑功能的类:
编写主板功能:
public class 主板 {
这里的电脑主板的开关机,也可以用下面的接口,这里就不这么写了。
public void open(){
System.out.println("电脑开机");
}
public void close(){
System.out.println("电脑关机");
}
public void 使用电脑其他功能(外设部件互连标准 标准){
if(标准!=null){
标准.open();
}else {
标准.close();
}
}
}
下面就是使用功能:
public static void main (String[] args){
// 模拟启动电脑的过程
主板 主板1 = new 主板();
主板1.主板运行();
// 使用声卡功能
外设部件互连标准 声卡1 = new 声卡();
声卡1.open();
// 使用网卡功能
外设部件互连标准 网卡1 = new 网卡();
网卡1.open();
}
问题又来了,我再使用功能的时候,每次都要new 具体的功能对象啊。如果有成千上万的功能,又怎么办 ? 改代码 ?
这时候,就用到了反射。
反射来了哈,前面这么多铺垫不容易呀。
我现在要做的就是,我只加功能,不改以前的代码。
以前是怎么调用,就怎么调用,也不主动new对象当参数传。并且我只管写我的 内存条 功能。以前的代码不变。
在说简单点,就是代码里只加一个类即可:
public class 内存条 implements 外设部件互连标准 {
public void open(){
System.out.println("内存开始运行");
}
public void close(){
System.out.println("关闭内存功能");
}
}
怎么来完成这个需求呢 ?
我把步骤写完整:
1. 创建标准接口类
public interface 外设部件互连标准 {
public void open();
public void close();
}
2. 创建电脑功能类(这里的类,可以随便加了,只要实现上面的接口,并且在配置文件中配置即可)
添加主板功能:
public class 主板 implements 外设部件互连标准 {
public void open(){
System.out.println("电脑开机");
}
public void close(){
System.out.println("电脑关机");
}
}
添加声卡功能:
public class 声卡 implements 外设部件互连标准 {
public void open(){
System.out.println("声卡运行听音乐");
}
public void close(){
System.out.println("声卡关机静音了");
}
}
添加网卡功能:
public class 网卡 implements 外设部件互连标准 {
public void open(){
System.out.println("网卡运行开始上网");
}
public void close(){
System.out.println("网卡关机停止上网");
}
}
添加内存条功能:
public class 内存条 implements 外设部件互连标准 {
public void open(){
System.out.println("内存开始运行");
}
public void close(){
System.out.println("关闭内存功能");
}
}
3. 编写配置文件 例如:pci.properties 内容为:
声卡地址=com.wqm.声卡
网卡地址=com.wqm.网卡
内存条地址=com.wqm.内存条
4.编写功能是否运行的判断类:
编写主板功能:
public class 运行电脑 {
public void 使用电脑功能(外设部件互连标准 标准){
if(标准!=null){
标准.open();
}else {
标准.close();
}
}
}
5. 编写启动类,一次编写 以后就不用再编写,修改了,只需要编写配置文件。
当然这里的功能,写的漏洞百出。但就是这么个意思。
public static void main(String[] args) {
运行电脑 运行电脑1 = new 运行电脑();
File configFile = new File("pci.properties");
Properties prop = new Properties();
FileInputStream fis = new FileInputStream(configFile);
prop.load(fis);
for(int x=0; x<prop.size(); x++){
String pciName = prop.getProperty("获取配置文件中的地址值");
Class clazz = Class.forName(pciName);//用Class去加载这个pci子类。
// 使用反射创建对象,调用方法
外设部件互连标准 标准 = (外设部件互连标准)clazz.newInstance();
运行电脑1.使用电脑功能(标准);
}
fis.close();
}
完工 !!!
具体的场景要自己慢慢领会。