设计模式之二里氏替换原则(LSP)

2018-08-08  本文已影响0人  李2牛

里氏替换原则

约定了继承的使用规范:

AbstractGun.java
public abstract class AbstractGun {
    public abstract void shoot();
}
Pistol.java
public class Pistol extends AbstractGun {
    @Override
    public void shoot() {
        System.out.println("使用手枪射击...biu~~");
    }
}
Rifle.java
public class Rifle extends AbstractGun {
    @Override
    public void shoot() {
        System.out.println("步枪射击... peng~~");
    }
}
MachineGun.java
public class MachineGun extends AbstractGun {
    @Override
    public void shoot() {
        System.out.println("机关枪射击...tu~~");
    }
}
Soldier.java
public class Soldier {
    private AbstractGun gun;
    public void setGun(AbstractGun gun){
        this.gun = gun;
    }
    public void killEnemy(){
        System.out.println("士兵开始射击...");
        gun.shoot();
    }
}
Client.java
public class Client {
    public static void main(String[] args) {
        Soldier soldier = new Soldier();
        soldier.setGun(new Rifle());
        soldier.killEnemy();
    }
}

当我们需要改变使用的枪时候,只需要在Client里面修改setGun的参数,部需要修改Soldier的相关方法,提高了代码可重用性。

Snipper.java
public class Snipper {
    private AUG aug;
    public void setRifle(AUG aug){
        this.aug = aug;
    }
    public void killEnemy(){
        aug.zoomOut();
        aug.shoot();
    }
}
AUG.java
public class AUG extends Rifle{
    public void zoomOut(){
        System.out.println("开始使用瞄准镜观察~~");
    }
    public void shoot(){
        System.out.println("AUG开始射击... peng~~");
    }
}
Father.java
public class Father{
    public Collection doSomething(HashMap map){
        System.out.println("调用父类----------------------");
        return map.values();
    }
}
Child.java
public class Child extends Father{
    public Collection doSomething(Map map){
        System.out.println("调用子类----------------------");
        return map.values();
    }
}
Client.java
public class Client{
    public static void invoker(){
        Father f = new Father();//-------------------------------------------------------------------
        HashMap map = new HashMap();
        f.doSomething(map);
    }
    public static void main(String[] args) {
        invoker();
    }
}

根据里氏替换规则,父类出现的地方子类就可以出现,所以这里的Father对象可以替换为Child对象。

上一篇 下一篇

猜你喜欢

热点阅读