zoukankan      html  css  js  c++  java
  • 里氏代换原则(LSP)

    子类必须能替换成它们的父类(龙生龙,凤生凤,老鼠的儿子会打洞)

    可以这么理解,进公司之前人事当然会告诉你公司的制度,如果这个

    公司出得米米比较多,你可能会看都不看就签上你的大名,如果有一天

    人事告诉你因为你一个月因为连续迟到3天而将被开除,你肯定后悔

    没有认真看过制度,这个小例子说明一旦你继承某个类(成为公司员工),

    你就不该该改变它的基本行为(一个月迟到3次),否则你将死的很惨.

    (或者你是超人,可以拯救全人类)

    public interface IWorker {

       void eat();

       void work();

    }

    public class Manager {

    private IWorker iWorker;

    public IWorker getiWorker() {

    return iWorker;

    }

    public void setiWorker(IWorker iWorker) {

    this.iWorker = iWorker;

    }

       

    public void mange(boolean isWorkingHour)

    {

    if(isWorkingHour)

    iWorker.work();

    else

    iWorker.eat();

    }

    }

    public class Robert implements IWorker {

    @Override

    public void eat() {

    DebugLog.log("i am R2, i am eating");

    }

    @Override

    public void work() {

    DebugLog.log("i am R2, i am eating");

    }

    }

     
    public class Worker implements IWorker {
     
    @Override
    public void eat() {
    DebugLog.log("i am Jedi Warrior, i am eating");
     
    }
     
    @Override
    public void work() {
    DebugLog.log("i am Jedi Warrior, i am working");
    }
     
    }
    public class Test {
     
    /**
    * @param args
    */
    public static void main(String[] args) {
    IWorker aRobert=new Robert();
    IWorker aWorker= new Worker();
    Manager aManager=new Manager();
    aManager.setiWorker(aWorker);
    aManager.mange(true);
     
    aManager.setiWorker(aRobert);
    aManager.mange(false);
     
    }
     
    }
    工人是人,当然先要吃饭,才能做事,机器人不是人,可以24*7为人类服务
    ,从代码可以看出,机器人继承了iworker,导致机器人也需要吃饭。解决这个
    问题很简单,将吃饭和工作的接口分离出来,机器人只要实现work接口就可以了。
     
     
    public interface IEatable {
    void eat();
    }
     
    public interface IWorkable {
       void work();
    }
     
    public class Manager {
    private IWorkable iWorkable;
    private IEatable iEatable;
     
    public IWorkable getiWorkable() {
    return iWorkable;
    }
     
    public void setiWorkable(IWorkable iWorkable) {
    this.iWorkable = iWorkable;
    }
     
    public IEatable getiEatable() {
    return iEatable;
    }
     
    public void setiEatable(IEatable iEatable) {
    this.iEatable = iEatable;
    }
     
    public IWorkable getiWorker() {
    return iWorkable;
    }
     
    public void mangEatableWork(boolean isWorkingHour) {
    if (isWorkingHour)
    iWorkable.work();
    else
    iEatable.eat();
    }
     
    public void mangNonEatableWork() {
    iWorkable.work();
    }
    }
     
    public class Robert implements IWorkable{
     
    @Override
    public void work() {
    DebugLog.log("i am R2, i am working");
    }
     
    }
     
    public class Worker implements IWorkable,IEatable {
     
    @Override
    public void eat() {
    DebugLog.log("i am Jedi Warrior, i am eating");
     
    }
     
    @Override
    public void work() {
    DebugLog.log("i am Jedi Warrior, i am working");
    }
     
    }
     
    public class Test {
     
    /**
    * @param args
    */
    public static void main(String[] args) {
    Robert aRobert=new Robert();
     
    Worker aWorker= new Worker();
    Manager aManager=new Manager();
    aManager.setiWorkable(aWorker);
    aManager.setiEatable(aWorker);
    aManager.mangEatableWork(false);
     
    aManager.setiWorkable(aRobert);
    aManager.mangNonEatableWork();
     
    }
     
    }
     
  • 相关阅读:
    python基础三大器之装饰器
    python基础之推导式及匿名函数和高阶函数
    python基础之三大器中迭代器和生成器
    python基础之函数(动态参数,注释,名称空间,第一类对象及使用和函数嵌套)
    python基础之初识函数
    python基础之文件操作
    python基础之集合及基础补充(循坏删除,二次编码)
    Python基础之小数据池及深浅拷贝
    python基础之字典
    数据结构-栈
  • 原文地址:https://www.cnblogs.com/budoudou/p/2299696.html
Copyright © 2011-2022 走看看