1.耦合性
java是面向对象编程的,我们可以理解java中一个类就是一个相对独立的功能模块。这样就可以达到类的复用。既然是复用,那么类与类之间肯定是有相互依赖的。这种依赖关系就是耦合性。
我们编程的一个指导原则就是高内聚低耦合。
为什么要低耦合呢?
1.高耦合的代码将很难扩展,如果相互依赖太紧密,就会出现改一个bug而影响其他类,从而产生新的bug。
2.如果完全没有耦合了,那么每个类都能独立完成自己的功能,这样的代码将无法复用。
2.高耦合代码示例
package com.amber.ivy.spring;
/**
* 高耦合代码示例
* @author ivyamber
*
*/
public class Coupling {
public static void main(String[] args) {
CouplingMp3 mp3 = new CouplingMp3();
mp3.play();
}
}
/**
* 古典音乐家类
* @author ivyamber
*
*/
class ClassicMusicSinger
{
public void sing()
{
System.out.println("我是古典音乐家,我唱古典音乐");
}
}
/**
* 流行音乐家类
* @author ivyamber
*
*/
class PopMusicSinger
{
public void sing()
{
System.out.println("我是流行歌手,我唱流行音乐");
}
}
/**
* 高度耦合的mp3播放器
* @author ivyamber
*
*/
class CouplingMp3
{
private PopMusicSinger singer;
public CouplingMp3()
{
singer = new PopMusicSinger();
}
public void play()
{
singer.sing();
}
}
/**
* 高耦合代码示例
* @author ivyamber
*
*/
public class Coupling {
public static void main(String[] args) {
CouplingMp3 mp3 = new CouplingMp3();
mp3.play();
}
}
/**
* 古典音乐家类
* @author ivyamber
*
*/
class ClassicMusicSinger
{
public void sing()
{
System.out.println("我是古典音乐家,我唱古典音乐");
}
}
/**
* 流行音乐家类
* @author ivyamber
*
*/
class PopMusicSinger
{
public void sing()
{
System.out.println("我是流行歌手,我唱流行音乐");
}
}
/**
* 高度耦合的mp3播放器
* @author ivyamber
*
*/
class CouplingMp3
{
private PopMusicSinger singer;
public CouplingMp3()
{
singer = new PopMusicSinger();
}
public void play()
{
singer.sing();
}
}
以上代码mp3每次只能播放流行音乐,这肯定不是我们想要的结果。
3.使用接口和构造注入实现低耦合
package com.amber.ivy.spring;
/**
* 低耦合代码示例
* @author ivyamber
*
*/
public class NoneCoupling {
public static void main(String[] args) {
//演唱流行乐
NoneCouplingMp3 mp3 = new NoneCouplingMp3(new NonePopMusicSinger());
mp3.play();
//演唱古典音乐
mp3 = new NoneCouplingMp3(new NoneClassicMusicSinger());
mp3.play();
}
}
/**
* 音乐家类,所有类型的音乐家都要实现这个类
* @author ivyamber
*
*/
interface Singer
{
void sing();
}
/**
* 古典音乐家类
* @author ivyamber
*
*/
class NoneClassicMusicSinger implements Singer
{
public void sing()
{
System.out.println("我是古典音乐家,我唱古典音乐");
}
}
/**
* 流行音乐家类
* @author ivyamber
*
*/
class NonePopMusicSinger implements Singer
{
public void sing()
{
System.out.println("我是流行歌手,我唱流行音乐");
}
}
/**
* 高度耦合的mp3播放器
* @author ivyamber
*
*/
class NoneCouplingMp3
{
private Singer singer;//使用接口而不是用具体的实现
public NoneCouplingMp3(Singer singer)
{
this.singer = singer;
}
public void play()
{
singer.sing();
}
}
/**
* 低耦合代码示例
* @author ivyamber
*
*/
public class NoneCoupling {
public static void main(String[] args) {
//演唱流行乐
NoneCouplingMp3 mp3 = new NoneCouplingMp3(new NonePopMusicSinger());
mp3.play();
//演唱古典音乐
mp3 = new NoneCouplingMp3(new NoneClassicMusicSinger());
mp3.play();
}
}
/**
* 音乐家类,所有类型的音乐家都要实现这个类
* @author ivyamber
*
*/
interface Singer
{
void sing();
}
/**
* 古典音乐家类
* @author ivyamber
*
*/
class NoneClassicMusicSinger implements Singer
{
public void sing()
{
System.out.println("我是古典音乐家,我唱古典音乐");
}
}
/**
* 流行音乐家类
* @author ivyamber
*
*/
class NonePopMusicSinger implements Singer
{
public void sing()
{
System.out.println("我是流行歌手,我唱流行音乐");
}
}
/**
* 高度耦合的mp3播放器
* @author ivyamber
*
*/
class NoneCouplingMp3
{
private Singer singer;//使用接口而不是用具体的实现
public NoneCouplingMp3(Singer singer)
{
this.singer = singer;
}
public void play()
{
singer.sing();
}
}
spring依赖注入做的更好,下面我将用spring来演示依赖注入