!. 依赖要使用的功能,而不是具有该功能的类
方式一
类A需要一个闹钟功能 钟表类B具有闹钟功能
引用了钟表类B 手机类C 具有闹钟功能
洗衣机类D具有闹钟功能
这是一种强耦合关系,如果不想使用钟表类,想换成手机类C就麻烦了
方式二
类A需要一个闹钟功能 具有闹钟功能的接口INAOZHONG
引用了接口INAOZHONG 钟表类B实现了INAOZHONG
手机类C实现了INAOZHONG
洗衣机类D实现了INAOZHONG
这是一种弱耦合关系,只依赖功能接口,任何实现该接口,具有该功能的类都可以使用
怎么使用就是下面要说的,依赖数据,而不是依赖程序类
!. 依赖数据、而不是程序类
配置文件
===========================================================================
方式一
类A需要一个闹钟功能
引用了接口INAOZHONG
new 钟表类B()
还是强耦合关系,修改提供闹钟功能的对象时,需要改代码。
方式二
类A需要一个闹钟功能
引用了接口INAOZHONG
Factory.getBean(INAOZHONG.class.getName());//这里只是用全路径名称作为接口Bean的id了。
bean.xml
<bean id="org.test.INAOZHONG" >
<impl ref="org.test.ZHONGBIAOImpl" />
</bean>
<bean id="org.test.ZHONGBIAOImpl" class="org.test.ZHONGBIAOImpl"/>
<bean id="org.test.SHOUJIImpl" class="org.test.SHOUJIImpl"/>
<bean id="org.test.XIYIJIImpl" class="org.test.XIYIJIImpl"/>
Factory类
getBean();//通过beanId获取bean对象;这里主要去拿接口INAOZHONG的bean对象,返回的是一个实现类对象。
还是弱耦合关系,修改提供闹钟功能的对象时,需要改XML数据。
监听器
===========================================================================
还有一种依赖数据就是监听器
学生类A 分数类B
学生数据A 分数数据B
分数类B读取学生数据A,经过计算,得出分数数据B
学生数据A删除一行,该学生的分数数据需要级联删除,怎么实现呢?
方式一
学生类A中直接删除分数数据B
分数类B依赖于学生数据A
类A依赖于分数数据B
这是双向依赖关系
方式二
学生类A中只删除学生的数据
数据类建立监听器,对感兴趣的监听器处理器发广播
分数类B建立监听处理器对象,放到监听器的池子中
分数类B依赖于学生数据A
学生类A只依赖自己的数据
级联删除通过监听器的方式建立关联,而这种关联是数据的依赖,而不是程序类的依赖
这是单向依赖关系,另一个方向的依赖是数据,很弱
学习了 http://blog.csdn.net/iamkila/article/details/7257303 的文章