一、 "开放-封闭"原则(OCP)

前端之家收集整理的这篇文章主要介绍了一、 "开放-封闭"原则(OCP)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

 软件腐化的原因:
<p style="FONT-SIZE: 10pt">问题所在   设计目标----------------------------------------------------------------------------过于僵硬   可扩展性(新性能可以很容易加入系统)过于脆弱   灵活性(修改不会波及其它)复用率低   粘度过高   可插入性(新功能容易加入系统(气囊加入方向盘))


<p style="FONT-SIZE: 10pt"> 提高系统可复用性的几点原则:传统复用:1. 代码的粘帖复用2. 算法的复用3. 数据结构的复用


<p style="FONT-SIZE: 10pt">
可维护性与可复用性并不完全一致


<p style="FONT-SIZE: 10pt">* 对可维护性的支持

一、 "开放-封闭"原则(OCP)

修改关闭

修改,这使变化中的软件系统有一定的稳定性和延续性。

二、 里氏代换原则(LSP)

方法,接受妹妹作为参数。那么,这个"喜爱()"方法一般不能接受美人的实例。

Highlighter1_23_349_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_23_349_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_116_147_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_116_147_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_178_208_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_178_208_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_251_284_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_251_284_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_316_347_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_316_347_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_372_524_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_372_524_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_438_467_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_438_467_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_498_522_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_498_522_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   

Highlighter1_38_364_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_38_364_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_131_162_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_131_162_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_193_223_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_193_223_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_266_299_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_266_299_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_331_362_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_331_362_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_399_811_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_399_811_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_463_490_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_463_490_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_522_551_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_522_551_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_595_623_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_595_623_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_656_685_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_656_685_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_716_740_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_716_740_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_780_809_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_780_809_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_837_984_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_837_984_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_877_982_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_877_982_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   = r.getWidth() )Highlighter1_930_977_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_930_977_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">      

方法时,如果传入的是长方形对象,当高度大于宽度时,会自动增加宽度直到超出高度。但是如果传入的是正方形对象,则会陷入死循环。

代码重构

Highlighter1_28_85_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_28_85_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_125_451_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_125_451_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_218_249_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_218_249_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_280_310_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_280_310_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_353_386_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_353_386_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_418_449_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_418_449_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_488_759_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_488_759_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_550_579_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_550_579_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_610_634_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_610_634_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_666_695_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_666_695_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_728_757_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_728_757_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   


Box,Chris Sells,《.NET本质论 第1卷:公共语言运行库》,中国电力出版社

评论
性能可以很容易加入系统) 过于脆弱 灵活性(修改不会波及其它) 复用率低 粘度过高 可插入性(新功能容易加入系统(气囊加入方向盘))       
 re: C#设计模式(2) 2005-06-16 09:10
 re: C#设计模式(2) 2005-06-16 12:20
     
 re: C#设计模式(2) 2005-06-19 10:27
增加删除基类的一些特性来创建子类的话,只能说明这2者是不适合有继承关系的,这正如猫之于狗。       
 re: C#设计模式(2) 2005-09-05 16:30
     
 re: C#设计模式(2) 2005-09-26 22:01
属性相同,就那么一点不同,但失之毫厘,差之千里,正放形和长方形在继承层次里面应该属于同一层次,可以把它们的公共属性和行为抽象出来做基类       
 re: C#设计模式(2) 2005-09-26 22:11
功能完全重复,只保留setSide就行了       
 re: C#设计模式(2) 2005-10-08 19:45
= r.getWidth() 改为r.getHeight() > r.getWidth() 。这样就不会出现死循环了,而且我认为也应该是合理的,不知道是不是应该这样,还请吕兄赐教。       
 re: C#设计模式(2) 2005-10-10 12:28
     
 re: C#设计模式(2) 2005-11-03 16:51
= r.getWidth() 改为r.getHeight() > r.getWidth() ”,那么在系统中加入正方形类后代码中所有长方形相关的代码都会受影响,这不正是失去了抽象的意义了吗?这样正好违反了LSP原则 !       
 re: C#设计模式(2) 2005-11-08 13:52
     
 re: C#设计模式(2) 2005-11-08 20:33
代码来讨论问题是没太大意义的。 首先, 凭什么说你上面的代码就能正确而全面的反映“长方形”这个概念? 如果说从数学上很明显正确的东西(比如正方形属于长方形或正方形是长方形的子类)而从你的代码上解释不通, 这时候我们首先想到的应该是你的代码有问题, 而不是从很可能有问题代码来验证结论很明确的数学概念, 难道大家不这么认为吗? 再次, 你的论据: “ 如果正方形是长方形的子类,那么: Square s = new Square(); s.setWidth(8); s.setHeight(5); 那正方形的面积是25。 ” 是有问题的。 你的前提既然是说正方形(引用你的话“如果正方形是长方形的子类”), 那为什么又出现“s.setWidth(8); s.setHeight(5); ”这样的情况呢? 既然是正方形为何两个边的长度要设为不同? 不解!       
 re: C#设计模式(2) 2005-11-09 10:17
     
 re: C#设计模式(2) 2005-12-21 17:36
修改。许多时候,我们说是,其实我们并没有证明过,只不过是我们所认为的权威说是。我想我们应该尽量抛开我们已有的认识,尽量从“设计模式”出发去考量正方形与长方形之间更为合理的关系。       
 re: C#设计模式(2) 2005-12-25 22:27
     
 re: C#设计模式(2) 2005-12-27 11:42
添加一条约束:每一条边和邻边不一定要相等。那么正方形就无法适合于这条约束,那么将出现无法继承的情况。这时候可能就要建立一个直角4方形这么个类,让长方形和正方形都直接这里继承。 所以是否是继承关系关键是约束,不同的约束范围,会产生不同结果。在BOB的<敏捷软件>中有详细说明,大家可以去看看。 再举一个鸭嘴兽的例子,假如浦乳动物的约束是:恒温,喂奶,那么鸭嘴兽可以是浦乳动物的子类,但要是再加一个约束:必须是胎生,那么鸭嘴兽就不可做浦乳动物的子类,目前动物学术界基本上认为鸭嘴兽属于浦乳动物。       
 re: C#设计模式(2) 2006-02-05 13:24
     
 re: C#设计模式(2) 2006-02-08 11:30
= rectangle.getSide2() ) { rectangle.setSide2(rectangle.getSide2() + 1); } System.out.println("rectangle:"); System.out.println(rectangle.getSide1()); System.out.println(rectangle.getSide2()); System.out.println(); } } 我传入的矩形是一个正方形,结果也没什么死循环啊。       
 re: C#设计模式(2) 2006-02-08 13:00
函数,是需要知道4条边的。然后矩形继承4边行,可以只有长宽就构造一个矩形,当然,原4边形的4条边的属性应该分别对应这里的,宽,长,宽,长(你要说长,宽,长,宽也一样)。其周长的得到式都是4边之和,因此就写在基类就可以了。而面积,对于矩形来说,边1和边2的乘积就可以。 下面是正方形,正方形,是继承矩形的,但其构造函数应该只要一个边就可以了,因此,这里的构造函数,对应矩形构造函数里的两个参数,宽和高都用正方形的边就可以了。这时候,就可以通过getRoundLength()和getArea()很轻松的得到他们的周长和面积。 注:普通的四边形要知道面积,关靠边是不行的,还要引入角的概念,这里就没有复杂化了。       
 re: C#设计模式(2) 2006-02-08 15:43
代码改进后还是出现了和楼主一样的情况,看来还是lingate 说的对,关键是限制条件的原因: //四边形 public class FourSide { public FourSide(int side1,int side4) { this.side1 = side1; this.side2 = side2; this.side3 = side3; this.side4 = side4; } public FourSide(Rectangle rectangle){ this.side1 = rectangle.getSide1(); this.side2 = rectangle.getSide2(); this.side3 = rectangle.getSide3(); this.side4 = rectangle.getSide4(); } public FourSide(Square square){ this.side1 = square.getSide1(); this.side2 = square.getSide2(); this.side3 = square.getSide3(); this.side4 = square.getSide4(); } private int side1 = 0; private int side2 = 0; private int side3 = 0; private int side4 = 0; public int getSide1() { return side1; } public void setSide1(int side1) { this.side1 = side1; } public int getSide2() { return side2; } public void setSide2(int side2) { this.side2 = side2; } public int getSide3() { return side3; } public void setSide3(int side3) { this.side3 = side3; } public int getSide4() { return side4; } public void setSide4(int side4) { this.side4 = side4; } protected int getRoundLength() { return side1 + side2 + side3 + side4; } } //矩形 public class Rectangle extends FourSide { public Rectangle(int width,height); this.width = width; this.height = height; } public Rectangle(Square square) { super(square); } private int width = 0; private int height = 0; public int getWidth() { return width; } public void setWidth(int width) { this.width = width; super.setSide1(width); super.setSide3(width); } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; super.setSide2(height); super.setSide4(height); } public void setSide1(int side1) { setWidth(side1); } public void setSide2(int side2) { setHeight(side2); } public void setSide3(int side3) { setWidth(side3); } public void setSide4(int side4) { setHeight(side4); } public int getArea() { return this.width * this.height; } } //正方形 public class Square extends Rectangle { public Square(int sideLenght) { super(sideLenght,sideLenght); this.sideLenght = sideLenght; } private int sideLenght = 0; public int getSideLenght() { return sideLenght; } public void setSideLenght(int sideLenght) { this.sideLenght = sideLenght; super.setWidth(sideLenght); super.setHeight(sideLenght); } public void setWidth(int width) { setSideLenght(width); } public void setHeight(int height) { setSideLenght(height); } public void setSide1(int side1) { setSideLenght(side1); } public void setSide2(int side2) { setSideLenght(side2); } public void setSide3(int side3) { setSideLenght(side3); } public void setSide4(int side4) { setSideLenght(side4); } }        
 re: C#设计模式(2) 2006-05-18 16:29
     
 re: C#设计模式(2) 2006-06-13 17:10
添加了这一条约束,当然就把正方形拒之门外了。 Rectangle r = new Rectangle(); r.setWidth(8); r.setHeight(5); 长方形的面积是40。 正方形是长方形的子类: Square s = new Square(); s.setWidth(8); s.setHeight(5); 正方形的面积是25,这是很正常的,因为在setHeight和setWidth中,子类重载了方法,会按正方形的约束把相邻的两边都置为相等!如果你认为一定是非得8*5=40就错了,面积是子类的内部逻辑算出来的,并不是输入的人认为是多少就多少。       
 re: C#设计模式(2) 2006-07-25 00:51
     
 re: C#设计模式(2) 2006-09-26 15:26
提取共同点。       
 re: C#设计模式(2) 2006-11-27 17:10
     
 re: C#设计模式(2) 2006-12-30 14:35

猜你在找的C#相关文章