zoukankan      html  css  js  c++  java
  • 接口隔离原则(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();
    }
     
    }
     
  • 相关阅读:
    POJ 1984
    剑指offer 7. 斐波那契数列 & leetcode 剑指 Offer 10- I. 斐波那契数列
    剑指offer 60. 把二叉树打印成多行
    数据库的范式(建表的原则)
    剑指offer 59. 按之字形顺序打印二叉树
    力扣142.环形链表II & 剑指offer 55. 链表中环的入口结点
    GET 和 POST 的区别
    理解Cookie和Session的区别及使用
    基本排序算法代码实现,以及使用场景推荐
    The Castle OpenJ_Bailian
  • 原文地址:https://www.cnblogs.com/budoudou/p/2299712.html
Copyright © 2011-2022 走看看