PS:很少写博~看了一篇文章受了刺激~决定也写写博客~文笔很次大家喜欢看就看,不喜欢也别拍砖~
很久很久以前~~
在美丽的城堡里面住着一位漂亮的公主,他和他的家人、朋友幸福的生活着;
有一天邪恶的格格巫来到了这个城堡,他看见了漂亮的公主于是她决定要将公主抢走~
格格巫使用了一个邪恶的魔法将公主抓了起来,公主很害怕、国王很着急~
这是来了一个真正的勇士他的名字叫做小灰灰~~~
小灰灰伟大的英雄~他经历的千难万险拯救了公主~
公主深深的爱上了小灰灰~从此他们幸福的在一起白头偕老~
这是一段美丽的故事,指头人们决定将这段感人的历史记录下来
/**
* 伟大的英雄
*/
public class Hero {
private String name;
private RescueQuest quest;
public Hero(String name) {
this.name=name;
quest=new RescueQuest();
}
public Princess embarkOnQuest() throws PrincessNotFoundException{
return quest.embark();
}
}
/**
* 艰难的拯救任务
*/
public class RescueQuest {
public Princess princess;
public Princess embark() throws PrincessNotFoundException {
princess = null;
// Our Hero do a Hard job to look for pretty princess
System.out.println("Our Hero do a hard job to look for the pretty princess");
// .......
return princess;
}
}
/**
* 美丽的公主
*/
public class Princess {
public void KissHero(){
System.out.println("Princess give him a SweetKiss!");
}
}
于是指头人开始尝试演绎这段历史~
/**
* 指头人们尝试演绎这段历史
*/
public class StoryTest extends TestCase{
public StoryTest(String testName) {
super(testName);
}
public static Test getTestSuit(){
return new TestSuite(StoryTest.class);
}
public void testStory() throws PrincessNotFoundException{
Hero hero = new Hero("小灰灰");
Princess princess = hero.embarkOnQuest();
assertNotNull(princess);
}
}
在公开表演之前他们信心十足~但细心的指头人们还是决定进行一次彩排~
可怕的事情发生了~
**他们的英雄需要一个拯救任务!他们测试英雄的描述就等于间接的测试了一个拯救任务,而拯救任务又关联了一场异常....
**这样他们根本没有办法可控的验证英雄的形象是否可靠~
聪明的指头人发现了问题的关键~Hero怎么获得RescueQuest的?
不管Hero是实例化了一个RescueQuest还是从JNDI查找了一个Quest,Hero都要负责去获得一个任务。
但是给英雄设置障碍应该是可恶的格格巫的工作啊~
问题出现了我们的Hero依赖Quest
**************指头人的回忆录**************
在业务处理过程中常常需要多个对象相互关联才能进行。
这种耦合是一个双头怪:
他常常给我们带来问题,但是没有耦合我们却什么都不能做。
这种耦合有时候叫做依赖~
通常解决耦合的方法就是讲具体的实现类隐藏在接口之下
这样替换具体的实现类就不会影响引用类
**************************************
于是乎指头人从新修改了他们的描述
他们创建一个抽象的接口代表RescueQuest
public interface Quest {
Object embark() throws QuestFaildException;
}
并且修改了其它的类以适应这次修改,对于指头人这是一次痛苦的经历
但是问题并没有好转,因为即使是这样小灰灰还是只能进行拯救公主的冒险
**************指头人的回忆录**************
问题是该样小灰灰自己去获取一个任务
还是应该由格格巫给他一个任务
这是问题的关键
**************************************
指头人修改了Hero让他可以被给予一个任务而不是自己去获取一个任务
他们给他添加了一个Setter
public class Hero {
private String name;
private Quest quest;
public Hero(String name) {
this.name=name;
}
public Object embarkOnQuest() throws QuestFaildException{
return quest.embark();
}
public void setQuest(RescueQuest quest) {
this.quest = quest;
}
}
好了现在小灰灰可以接受挑战啦~~~
我们来看看格格巫是怎么给小灰灰赋予一个挑战的~
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!--这里格格巫就定义了一个挑战-->
<bean id="quest" class="fd2.springlearn.di.entity.RescueQuest"></bean>
</beans>
好吧~/** * 指头人们尝试演绎这段历史 */ public class StoryTest extends TestCase{ public StoryTest(String testName) { super(testName); } public static Test getTestSuit(){ return new TestSuite(StoryTest.class); } // public void testStory() throws QuestFaildException{ // Hero hero = new Hero("小灰灰"); // Princess princess = (Princess) hero.embarkOnQuest(); // assertNotNull(princess); // } public void testStory2() throws QuestFaildException{ Hero hero = new Hero("小灰灰"); BeanFactory factory = new XmlBeanFactory(new FileSystemResource("src/main/resources/applicationContext.xml")); Quest quest = (Quest) factory.getBean("quest"); hero.setQuest(quest); Princess princess = (Princess) hero.embarkOnQuest(); assertNotNull(princess); } }
我承认我的故事讲得很烂~很烂~
第一篇希望大家能见谅~
总结一下:
1.我们离不开代码的耦合,可以理解成耦合就是一种依赖
2.解耦合常用的一种方式使用接口隐藏实现类,这样实现类的改变就不会影响引用类
3.啥事依赖说完了,用硬编码方式写依赖的缺陷希望大家能体会。DI叫做依赖注入,至于怎么注入下次再说啦~