客户端不应该被强迫实现一些他们不会使用的接口(霸王条款)。
定义了某个接口,迫使它的实现类必须实现它的所有方法,即使
某个方法实现类根本不需要,导致实现类变得越来越胖。
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();
}
}