面向对象设计中的开放封闭原则
面向对象设计中的开放封闭原则
面向对象设计中的开放封闭原则开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。其他的设 计原则,很多时候是为实现这一目标服务的。
一、开发封闭原则,其核心的思想是:
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
二、开放封闭原则主要体现在两个方面:
对扩展开放:意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭:意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
实现开放封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以对修改就是封闭的;而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展 方法,所以对于扩展就是开放的。这是实施开放封闭原则的基本思路,同时这种机制是建立在两个基本的设计原则的基础上,这就是Liskov替换原则和合成/聚合复用原则。关于这两个原则。
三:为什么要用到开放封闭原则?
我们在做任何系统的时候,都不要指望系统一开始就需求确定,这是不现实也是不科学的想法,既然需求一定是会变化的,那么我们如何在面对需求变化时,设计的网站或软件可以保持相对容易修改,保持相对稳定,不至于新的需求到来,整个推倒重做。只要保持开放封闭原则就可以做到
面对新需求的到来,要完成新的需求,对程序的改动是通过新增加代码完成的,不是通过修改现有代码完成的
四:开放封闭原则的两个问题?
开放封闭原则是说,你设计软件或网站的时候,时刻要把需求的变化考虑全面了,尽量的让这个类足够好,写好了就不去修改它,如果新的需求来了,增加一些类来完成新的需求,原来的代码能不动则不动。
五:开放封闭原则中的两个问题的解决办法
在我们最开始写程序的时候,假设需求变化不会发生,但当发生需求变化时,我们就立即(当发生小变化时,就及早的去想办法应对发生大变化的可能)构造抽象来隔离以后发生的同类变化,不能等到开发工作进行到一半了或很久了,在考虑抽象,考虑分离,那时候就很困难了
六:开放封闭原则的好处
遵循这个原则可以带来面向对象技术中声称的可维护,可扩展,可复用,灵活性好这些好处
七:开放封闭原则的注意事项
不要对应用程序中的每个部分都刻意的进行抽象,应该对应用程序中出现频繁变化的那部分构造抽象。
八、以银行业务员为例
//首先声明一个业务处理接口 public interface IBankProcess{ void Process();} public class DepositProcess : IBankProcess { public void Process() { //办理存款业务 Console.WriteLine("Process Deposit"); } } public class WithDrawProcess : IBankProcess { public void Process() { //办理取款业务 Console.WriteLine("Process WithDraw"); } } public class TransferProcess : IBankProcess { public void Process() { //办理转账业务 Console.WriteLine("Process Transfer"); } } public class BankStaff { private IBankProcess bankpro = null; public void BankHandle(Client client) { switch (client.Type) { //存款 case "Deposit": userProc = new DepositUser(); break; //转账 case "Transfer": userProc = new TransferUser(); break; //取款 case "WithDraw": userProc = new WithDrawUser(); break; } userProc.Process(); } } //这样当业务变更时,只需要修改对应的业务实现类就可以,其他不相干的业务就不必修改。当业务增加,只需要增加业务的实现就可以了。
- python面向对象编写案例(Python面向对象程序设计示例小结)
- python面向对象实例教程(Python面向对象程序设计类的多态用法详解)
- 面向对象的装封、继承、多态的概念理解
- 面向对象设计中的开放封闭原则
- php如何继承多个类(PHP面向对象程序设计子类扩展父类子类重新载入父类操作详解)
- python中对象方法和顶级方法(Python3.5面向对象程序设计之类的继承和多态详解)
- python可视化界面实现管理系统(python面向对象实现名片管理系统文件版)
- python内置函数一览表(Python面向对象程序设计构造函数和析构函数用法分析)
- python学生信息管理系统教程(学生信息管理系统Python面向对象版)
- php面向对象教程理解(PHP面向对象程序设计之构造方法和析构方法详解)
- php语言程序设计基础面向对象(PHP面向对象程序设计之对象的遍历操作示例)
- php面向对象运用场景(PHP面向对象类型约束用法分析)
- javascript对象添加方法(详解JavaScript面向对象实战之封装拖拽对象)
- python支持面向对象的程序设计(Python面向对象程序设计之类的定义与继承简单示例)
- 面向对象设计中的单一职责原则
- php面向对象3大特征(PHP面向对象程序设计重载overloading操作详解)
- 战 疫 时刻 致敬每一位石化大学的 守护者(战疫时刻)
- 老弄堂里的市井味道(老弄堂里的市井味道)
- 小米音乐可绑定QQ音乐, QQ音乐 真的会消失在小米的设备上吗(小米音乐可绑定QQ音乐)
- 小米Watch S1评测 或许能成为小米冲击高端可穿戴设备的里程碑(小米WatchS1评测或许能成为小米冲击高端可穿戴设备的里程碑)
- 手机QQ与小米路由器在一起 明天揭晓,敬请期待(手机QQ与小米路由器在一起)
- 小米音乐与 QQ 音乐合作,便捷迁移会员(小米音乐与QQ音乐合作)
热门推荐
- sql语句执行顺序
- .NET中First,FirstOrDefault,Single,SingleOrDefault的区别
- pythonmatplotlib条形图动画(Python Matplotlib实现三维数据的散点图绘制)
- mysql如何删除外键约束数据(MySQL中外键的创建、约束以及删除)
- echart图表有哪些(使用laravel和ECharts实现折线图效果的例子)
- sqlserver语句创建窗口布局(SQL Server 2012 开窗函数)
- python编写一个名片(详解Python做一个名片管理系统)
- submit与button的区别
- tick数据间隔时间为2秒(让你一看就明白的$nextTick讲解)
- 怎么运行xampp中的mysql(本地安装了mysql导致xampp的mysql服务启动失败)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9