接口隔离原则(ISP)

客户端不应该被强迫实现一些他们不会使用的接口(霸王条款)。

定义了某个接口,迫使它的实现类必须实现它的所有方法,即使

某个方法实现类根本不需要,导致实现类变得越来越胖。

public interface Killer {

   void shoot();

}



public class MachineGun implements Killer {
 
@Override
public void shoot() {
   DebugLog.log("machine gun, enemies are killed");
}
 
}
 
public class Pistol implements Killer {
 
@Override
public void shoot() {
  DebugLog.log("pistol, kill enemies in short distance");
}
 
}
 
public class Rifle implements Killer {
 
@Override
public void shoot() {
DebugLog.log("Rifle, shoot the enemies in long distance ");
}
 
}
 
public class Soldier {
private Killer weapon;
 
public Killer getWeapon() {
return weapon;
}
 
public void setWeapon(Killer weapon) {
this.weapon = weapon;
}
 
public Soldier(Killer weapon) {
super();
this.weapon = weapon;
}
 
public void attack() {
weapon.shoot();
}
}
 
public class ToyGun implements Killer {
 
@Override
public void shoot() {
DebugLog.log("toy gun, can  not kill any enemy");
}
 
}
 
public class Test {
 
/**
* @param args
*/
public static void main(String[] args) {
Soldier aSoldier=new Soldier(new MachineGun());
aSoldier.attack();
aSoldier.setWeapon(new Pistol());
aSoldier.attack();
aSoldier.setWeapon(new Rifle());
aSoldier.attack();
 
aSoldier.setWeapon(new ToyGun());
aSoldier.attack();
}
 
}
士兵使用武器时都能杀人,不管是机关枪,来复枪还是别的武器。但是有一天
看到士兵拿着一把玩具枪出来吓你,你会有什么反应?
重构也很简单,玩具枪是用来娱乐的,它不应该实现shoot而应该实现entertaiment
public interface Toy {
   void entertainment();
}
 
 
public class ToyGun implements Toy {
 
@Override
public void entertainment() {
DebugLog.log("dingding dang,dingding dang");
}
 
}
 
 
public class Soldier {
private Killer weapon;
    private Toy toy;
public Killer getWeapon() {
return weapon;
}
 
public void setWeapon(Killer weapon) {
this.weapon = weapon;
}
 
public Toy getToy() {
return toy;
}
 
public void setToy(Toy toy) {
this.toy = toy;
}
 
public Soldier(Killer weapon) {
super();
this.weapon = weapon;
}
 
public void attack() {
weapon.shoot();
}
 
public void entertainment() {
toy.entertainment();
}
 
}
 
 
public class Test {
 
/**
* @param args
*/
public static void main(String[] args) {
Soldier aSoldier = new Soldier(new MachineGun());
aSoldier.attack();
aSoldier.setWeapon(new Pistol());
aSoldier.attack();
aSoldier.setWeapon(new Rifle());
aSoldier.attack();
ToyGun atoyGun = new ToyGun();
aSoldier.setToy(atoyGun);
aSoldier.entertainment();
}
 
}
 
原文地址:https://www.cnblogs.com/budoudou/p/2299712.html