IOC在墨者革离中的理解
实现墨者革离场景
- 首先是实现MoAttack
public class MoAttack{
public void cityGateAsk(){
//让演员进场
LiuDeHua liuDeHua = new LiuDeHua();
liuDeHua.responseAsk("墨者革离");
}
}
- 接口GeLi电影中的角色,需要演员去扮演他
public interface Geli {
void responseAsk(String ask);
}
- LiuDeHua类,指的是演员刘德华去扮演革离
public class LiuDeHua implements Geli {
public void responseAsk(String ask) {
System.out.println(ask);
}
}
- Play类实现main函数创建MoAttack
public class Play{
public static void main(String[] args){
MoAttack m=new MoAttack();
m.citeGateAsk();
}
}
简单执行就是输出“墨者革离”
思考问题
我们看出源代码中是LiuDeHua类实现了GeLi接口并在MoAttack类中进行实现场景。
但是如果是梁朝伟扮演革离的情况呢?
我们是不是要先实现LiangChaoWei类并继承GeLi,这一步是必须实现的。
但是在MoAttack类中我们还需要修改原先的代码
public class MoAttack{
public void cityGateAsk(){
//让演员梁朝伟进场
LiangChaoWei lcw= new LiangChaoWei();
lcw.responseAsk("墨者革离");
}
}
这时候问题来了,这也是这个问题用IOC思想去解决的关键:
假如古天乐、成龙等等也要演革离怎么办?
当然都是需要实现演员的创建的,
但是对于在MoAttack(其实就是业务层) 类中我们都需要去进行修改创建新的演员类并且让他们实现场景。
这样是非常麻烦的。
IOC
这个时候我们引入了IOC思想,大致思想为: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。
我们就说在墨者革离场景中来说IOC
对于此时业务层 MoAttack类拥有控制权(对应上面概念),我们需要一个外部容器 来得到控制权,使得创建对象的过程不需要业务层 参与。那么我们就以IOC思想进行下面的实现!
用IOC属性注入的方法解决
在业务层MoAttack类
public class MoAttack {
private Geli geli;
public void citeGateAsk(){
geli.responseAsk("墨者革离");
}
//注入革离的具体扮演者
public void setGeli(Geli geli) {
this.geli = geli;
}
}
这时我们引入外部容器就是Director
public class Director {
public void direct(){
MoAttack moAttack = new MoAttack();
//指定角色扮演者
moAttack.setGeli(new LiuDeHua());
moAttack.citeGateAsk();
}
}
这时我们可以看到解决了演员的问题,对于控制权这时已经属于了Director类,我们想要换演员不再需要去MoAttack中进行修改创建实现new方法,只需要在Director中的Set注入修改具体演员类就行了!