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();
    }
     
    }
     
  • 相关阅读:
    美团前端面经-2020-估计是凉了
    JavaScript的垃圾回收机制与内存泄漏
    从输入URL到浏览器显示页面发生了哪些事情---个人理解
    let 、const 、var、function声明关键字的新理解
    前端中堆和栈的概念
    今天想好好的认真开始维护自己的博客
    关于org.apache.poi 导出excel时引发的No such file or directory
    MySQL查询本周、上周、本月、上个月份数据的sql代码
    为mybatis mapper xml文件添加注释遇到问题
    ubuntu使用中遇到问题及解决方法持续整理
  • 原文地址:https://www.cnblogs.com/budoudou/p/2299712.html
Copyright © 2011-2022 走看看