关于面向对象设计模式:面向对象设计原则

开闭准则(Open Closed Principle,OCP):当利用的需要扭转时,在不批改软件实体的源代码或者二进制代码的前提下,能够扩大模块的性能,使其满足新的需要。 里氏替换准则(Liskov Substitution Principle,LSP):子类能够扩大父类的性能,但不能扭转父类原有的性能。也就是说:子类继承父类时,除增加新的办法实现新增性能外,尽量不要重写父类的办法。 依赖倒置准则(Dependence Inversion Principle,DIP):高层模块不应该依赖低层模块,两者都应该依赖其形象;形象不应该依赖细节,细节应该依赖形象。其核心思想是:要面向接口编程,不要面向实现编程。 违反依赖倒置准则代码(顾客每更换一家商店,都要批改一次代码,这显著违反了开闭准则。存在以上毛病的起因是:顾客类设计时同具体的商店类绑定了,这违反了依赖倒置准则): class Customer{ public void shopping(ShaoguanShop shop){ //购物 System.out.println(shop.sell()); }}class Customer{ public void shopping(WuyuanShop shop){ //购物 System.out.println(shop.sell()); }}批改后的合乎依赖倒置准则代码(定义“婺源网店”和“韶关网店”的独特接口 Shop,顾客类面向该接口编程,其代码批改如下:): public class DIPtest{ public static void main(String[] args){ Customer wang=new Customer(); System.out.println("顾客购买以下商品:"); wang.shopping(new ShaoguanShop()); wang.shopping(new WuyuanShop()); }}//商店interface Shop{ public String sell(); //卖}//韶关网店class ShaoguanShop implements Shop{ public String sell(){ return "韶关土特产:香菇、木耳……"; } }//婺源网店class WuyuanShop implements Shop{ public String sell(){ return "婺源土特产:绿茶、酒糟鱼……"; }} //顾客class Customer{ public void shopping(Shop shop){ //购物 System.out.println(shop.sell()); }}繁多职责准则(Single Responsibility Principle,SRP):繁多职责准则规定一个类应该有且仅有一个引起它变动的起因,否则类应该被拆分 ...

November 26, 2021 · 1 min · jiezi

关于面向对象设计模式:又是面向对象的一天

521了,就聊点和对象相干的吧~背景如果说要聊下面向对象(Object Oriented),那不得不提的就是和它绝对的另一个概念:面向过程(Procedure Oriented)。而面向对象产生的背景则是设计思维和理念的提高,以及零碎的日益简单,人们缓缓发现面向过程这种形式曾经不再适宜解决现有问题了,于是缓缓催生了面向对象这一概念。 而这两个概念之间的差别点,我认为外围在于剖析问题和对待问题的角度。 面向过程是偏差于过程的,对于一个问题,面向过程会将其拆解为一个个步骤,而后一步步执行,执行完了问题也就解决了。代表语言可能有 C语言, 这里说可能是因为C也能够定义构造体,也算肯定水平上狭义的对象,但整体上它还是面向过程的语言。 面向对象在解决一个问题时候,则是偏向于形象进去一个实体,而后将其作为一个整体或多个整体进行思考,而后解决问题。代表语言有 Java (老牌咖啡了)。 这样说可能有点绕,通晓区别的不看这篇文章也能了解,不通晓的可能看了这两句话也稍稍迷一点。 例子咱们无妨举个谈到面向对象都谈判到的一个问题:如何把一个大象放到冰箱里?。 面向过程首先咱们写个办法找到这个大象咱们执行办法,找到大象,失去他的坐标、大小等参数定义一个挪动大象的办法,接管 步骤2 中的参数,把大象移到冰箱前定义一个管制冰箱门的办法 调用 步骤4 的办法,传入 “开” 关上冰箱门调用 步骤3 的办法,大象挪动到冰箱里调用 步骤4 的办法,传入 “关” 敞开冰箱门咱们能够看到,以上的解决问题的办法就是有一个个步骤/过程组合而成的,而解决问题则是通过依照肯定的顺序调用办法进行。整体都是面向过程的。 面向对象那面向对象怎么该怎么解决这个问题呢? 首先咱们剖析下这个问题波及到哪些实体,这个问题中波及到了 冰箱 和 大象。 所以咱们就能够依照以下的形式进行了~ 定义两个对象:大象 & 冰箱给大象定义“行走”的办法(大象必定会走的嘛)给冰箱定义“开门” 和 “关门”的办法而后咱们就只须要 冰箱.开门 => 大象.行走(冰箱里) (让大象走到冰箱里) => 冰箱.关门 就ok了 整体咱们都是把二者作为了对象去对待,就像在事实中看待两个事物一样。 通过比照,咱们就明确面向对象和面向过程二者的区别啦~ 利用当初很多时候,说道面向对象大家就说Java;有的也说面向对象就是 Java。 这必定是错的,就像聊到区块链就说是比特币一样。 面向对象是一种思维,而 Java 则只是它的一种在编程语言方面的利用。而它的利用绝不仅仅于此,不仅 Java,当初对于数据库的设计、零碎层面的功能设计处处都是面向对象的利用。而对于这种思维的使用,还须要咱们有肯定的数据抽象能力。 咱们举个人物身份如何在软件系统中形象的例子,首先咱们把人的共有属性找进去,作为所有角色共有的;而后咱们再在这个根底下来向具体的工作角色具体,而后依据他们的不同职业去增加特有的属性或办法。这在 Java 中也就是封装和继承的体现。 多态则是说同一个动作(办法),不同实体有不同的体现,比如说上图中警察和歌手,都能够唱歌(办法),然而警察的唱歌可能是唱军歌,歌手的唱歌则可能是唱单身情歌。同一个办法在不同的实体有不同的体现。 另外,咱们在进行一个零碎开发设计的过程中,也不乏有面向对象的体现。比如说,咱们要写一个树洞小程序。 首先咱们要剖析,它波及到哪些对象:用户、动静、评论等(简略举这几个)。 而后对于用户,他的属性就有:账号、明码、角色、邮箱、昵称等等等。 对于动静,它就有谁发的(用户)、内容、公布工夫、更新工夫、状态等等。顺次类推,咱们零碎的库表构造根本就进去了,这里说的简略哈,具体问题具体分析。 而后对于办法,咱们围绕动静开展,就有公布、删除、查找等等一系列,这样围绕几个零碎的对象顺次开展,天然零碎性能根本也就列举进去了。当然到具体零碎还是须要具体流程具体分析。还是要同具体的业务逻辑挂钩滴。 定位那面向对象的定位是什么呢?目前面向对象根本能够解决大多数场景下的问题,长处也非常显著:结构性强、易拓展、易复用等。然而他也有一些毛病,比如说如果问题较小,齐全为了面向对象而面向对象,则会比拟“重”一些。 这货色就是编程倒退的必然产物,但也可能是两头产物。但就目前,这种思维还是能够滴! 之后可能会围绕Java的再谈一下面向对象在Java语言中的一些理念和准则,写个小短文,能够点个关注哦~ 感觉文章哪里有问题的小伙伴,能够点击查看原文滑到页面底部进行留言(没方法,公众号太年老了,没这个性能了) ...

May 21, 2021 · 1 min · jiezi