1.开闭原则

是面向对象设计的基本原则之一,是“可复用设计”的基础,它的主要原则是:对扩展开放,对修改关闭;意思就是我们改变一个软件时。应该通过扩展方式来改变软件,而不是修改原有的代码。

2.里氏替换原则

里氏替换原则是说,任何基类可以出现的地方,子类一定可以出现(只有当衍生类可以替换基类,软件单位的功能不受到影响,基类才能真正被复用,衍生类也能够在基类的基础上增加新的行为)。

下面我们通过建一个项目,简单实现一下,假如一个学生养了两只动物,一只狗一只猫,需要进行喂食(过程中导入头文件的操作省略,方法在.h中的声明也省略,请自行添加)

1.需要建立的类有:

根视图MainViewController,负责整体的调用与测试

继承自NSobject的类Animal和继承自Animal类的子类Cat和Dog

继承自NSObject的类Student

2.在Animal类中实现一个方法:

-(void)eat
{NSLog(@"动物吃不同的东西");
}

然后在其子类Cat和Dog中重写父类方法:

-(void)eat
{[super eat];NSLog(@"猫吃鱼");
}
-(void)eat
{[super eat];NSLog(@"狗吃骨头");
}

当然也要在Cat和Dog的头文件中引入 -( void )eat;不然Cat和Dog实例化的对象无法调用此方法

3.如果不使用开闭和里氏替换,则要在Student类中实现两个喂养方法(导入Cat和Dog的头文件):

-(void)feedCat:(Cat*)cat
{NSLog(@"学生喂猫了");[cat eat];
}-(void)feedDog:(Dog*)dog
{NSLog(@"学生喂狗了");[dog eat];
}

4.现在在MainViewController中的viewDidLoad中调用是这样的:

Student *stu=[[Student alloc]init];Dog *dog=[[Dog alloc]init];Cat *cat=[[Cat alloc]init];[stu feedCat:cat];[stu feedDog:dog];

这种基本实现方式是可以的,也能实现,但是如果学生又喂了一只乌龟,则又需要在Student中添加给乌龟喂食的方法,这种频繁修改源代码的方式不太可取,下面我们用上开闭原则和里氏替换原则,重复3和4的步骤;

3.只需要在Student类中实现一个喂养方法(导入Animal的头文件):

-(void)feed:(Animal*)animal
{NSLog(@"学生喂动物了");[animal eat];
}

4.在MainViewController中的viewDidLoad中需要这样调用:

Student *stu=[[Student alloc]init];Animal *aCat=[[Cat alloc]init];Animal *aDog=[[Dog alloc]init];[stu feed:aCat];[stu feed:aDog];

这样即使学生再喂养N只动物,Student里面的代码也不需要再去修改(满足了上面所说的开闭原则),大大减少了工作量,保持了代码的完整性;

这两行

Animal *aCat=[[Cat alloc]init];
Animal *aDog=[[Dog alloc]init];

就是里氏替换,其本质就是用子类去实例化父类声明的对象(即父类的指针指向子类开辟内存),然后调用子类内部的方法等。

开闭原则与里氏替换原则相关推荐

  1. 深入理解开闭原则、里氏替换原则

    开闭原则(Open-Closed Principle)里氏替换原则 开闭原则(Open-Closed Principle) What 什么是开闭原则? Why 为什么要使用开闭原则和When 什么时候 ...

  2. 软件设计原则之里氏替换原则、依赖倒置原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...

  3. 七大设计原则之里氏替换原则应用

    目录 1 里氏替换原则 2 里氏替换原则应用 1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 ...

  4. 6大设计原则之里氏替换原则

    面对对象中的继承 优点如下: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性 提高代码的重用性 子类可以形如父类,但又异于父类 提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类 ...

  5. python里氏替换原则_设计模式六大原则之里氏替换原则

    这是设计模式6 大原则系列的第二篇文章,附上前一篇文章地址:设计模式六大原则之单一职责原则.本文主要讲解设计模式的里氏替换原则. 肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其 ...

  6. java里氏替换原则例子_java 设计原则(六)里氏替换原则

    定义:如果对每一个类型T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型. 定义扩展:一个软件 ...

  7. 里氏替换原则_春辉带你了解面相对象设计第二原则(里氏替换原则)

    里氏替换原则的定义 里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的"面向对象 ...

  8. java solid设计原则_六大设计原则之里氏替换原则(LSP)

    一.SOLID 设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substit ...

  9. 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...

最新文章

  1. HDU 4300 Clairewd’s message
  2. BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)
  3. ce测试数据文章ce测试数据文章ce测试数据文章
  4. 开源工具Arena,数据科学家再也不用为Kubernetes犯难啦!
  5. 【转】常用的风控算法模型评价指标
  6. Ubuntu 18.04 忘记 mysql root密码及其重置
  7. Ubuntu的简单远程控制和远程桌面
  8. linux vim修改字符串,Linux系统vi(vim)编辑器命令说明
  9. windows 7 下 .net 开发环境的搭建
  10. win8.1使用及优化
  11. C语言中将字符串转换为数字
  12. 国产操作系统产业深度解析
  13. 电子祝福贺卡小程序有哪些?
  14. 接口测试平台-18:首页完善和项目模块初窥
  15. c语言实现面向对象OOC
  16. java实现上传zip/rar压缩文件,自动解压
  17. 电路设计实例(防止DC电源反接的方法)
  18. win10安装opcenum_Windows10镜像安装失败的两种解决方法
  19. php基于cookie的注册,关于php:如何为注册页面设置Cookie?
  20. python应用——将raw文件转化为jpg文件,并显示图像

热门文章

  1. 快别「一句wòcào行天下」,清华开源了个神器专治词穷!
  2. 《PatchMatch Stereo - Stereo Matching with Slanted Support Windows》
  3. 【IoT】产品设计:一个风险管理矩阵工具送给你「预测、管理、减轻风险」
  4. 炫影创意街头玩具TIY玩法多样,EW刺激过瘾!EW
  5. java swing 常用的三种布局方式:边界布局、流布局、网格布局管理器
  6. union和join的粗理解,仅供参考
  7. 【监控工具之Spotlight】
  8. Part2.1——Linux下的网络配置
  9. Service 服务详解 及自定义服务模板
  10. 投资98万美元的Saas项目失败了