C#设计模式(2)

转载 2006年06月10日 15:45:00
《人月神话》焦油坑、没有银弹

* 软件腐化的原因:
问题所在   设计目标
----------------------------------------------------------------------------
过于僵硬   可扩展性(新性能可以很容易加入系统)
过于脆弱   灵活性(修改不会波及其它)
复用率低  
粘度过高   可插入性(新功能容易加入系统(气囊加入方向盘))
* 提高系统可复用性的几点原则:
传统复用:
1. 代码的粘帖复用
2. 算法的复用
3. 数据结构的复用
* 可维护性与可复用性并不完全一致
* 对可维护性的支持:

一、 "开放-封闭"原则(OCP)
Open-Closed Principle原则讲的是:一个软件实体应当对扩展开放,对修改关闭。
优点:
    通过扩展已有软件系统,可以提供新的行为,以满足对软件的新的需求,使变化中的软件有一定的适应性和灵活性。
    已有软件模块,特别是最重要的抽象层模块不能再修改,这使变化中的软件系统有一定的稳定性和延续性。
例子:玉帝招安美猴王
当年大闹天宫便是美猴王对玉帝的新挑战。美猴王说:"'皇帝轮流做,明年到我家。'只教他搬出去,将天宫让于我!"对于这项挑战,太白金星给玉皇大帝提出的建议是:"降一道招安圣旨,宣上界来…,一则不劳师动众,二则收仙有道也。"
换而言之,不劳师动众、不破坏天规便是"闭",收仙有道便是"开"。招安之道便是玉帝天庭的"开放-封闭"原则。
 
招安之法的关键便是不允许更改现有的天庭秩序,但允许将妖猴纳入现有秩序中,从而扩展了这一秩序。用面向对象的语言来讲,不允许更改的是系统的抽象层,而允许更改的是系统的实现层。

二、 里氏代换原则(LSP)
Liskov Substitution Principle(里氏代换原则):子类型(subtype)必须能够替换它们的基类型。
白马、黑马
 
反过来的代换不成立
《墨子·小取》说:"娣,美人也,爱娣,非爱美人也……"娣便是妹妹,哥哥喜爱妹妹,是因为两人是兄妹关系,而不是因为妹妹是个美人。因此,喜爱妹妹不等同于喜爱美人。用面向对象语言描述,美人是基类,妹妹是美人的子类。哥哥作为一个有"喜爱()"方法,接受妹妹作为参数。那么,这个"喜爱()"方法一般不能接受美人的实例。
 
一个违反LSP的简单例子(长方形和正方形)
public class Rectangle
{
   
private long width;
   
private long height;
    
   
public void setWidth(long width)
   
{
      
this.width = width;
   }

   
public long getWidth()
   
{
      
return this.width;
   }

   
public void setHeight(long height)
   
{
      
this.height = height;
   }

   
public long getHeight()
   
{
      
return this.height;
   }

}


public class Square
{
   
private long side;
    
   
public void setSide(long side)
   
{
      
this.side = side;
   }


   
public long getSide()
   
{
      
return side;
   }

}

正方形不可以做长方形的子类
using System;

public class Rectangle
{
   
private long width;
   
private long height;
    
   
public void setWidth(long width)
   
{
      
this.width = width;
   }

   
public long getWidth()
   
{
      
return this.width;
   }

   
public void setHeight(long height)
   
{
      
this.height = height;
   }

   
public long getHeight()
   
{
      
return this.height;
   }

}


public class Square : Rectangle
{
   
private long side;

   
public void setWidth(long width)
   
{
      setSide(width);
   }


   
public long getWidth()
   
{
      
return getSide();
   }


   
public void setHeight(long height)
   
{
      setSide(height);
   }


   
public long getHeight()
   
{
      
return getSide();
   }


   
public long getSide()
   
{
      
return side;
   }


   
public void setSide(long side)
   
{
      
this.side = side;
   }

}


public class SmartTest
{
   
public void resize(Rectangle r)
   
{
      
while (r.getHeight() >= r.getWidth() )
      
{
         r.setWidth(r.getWidth() 
+ 1);
      }

   }

}
 
在执行SmartTest的resize方法时,如果传入的是长方形对象,当高度大于宽度时,会自动增加宽度直到超出高度。但是如果传入的是正方形对象,则会陷入死循环。
代码重构
public interface Quadrangle
{
   
public long getWidth();
   
public long getHeight();
}


public class Rectangle : Quadrangle 
{
   
private long width;
   
private long height;
    
   
public void setWidth(long width)
   
{
      
this.width = width;
   }

   
public long getWidth()
   
{
      
return this.width;
   }

   
public void setHeight(long height)
   
{
      
this.height = height;
   }

   
public long getHeight()
   
{
      
return this.height;
   }

}


public class Square : Quadrangle 
{
   
private long side;

   
public void setSide(long side)
   
{
      
this.side = side;
   }


   
public long getSide()
   
{
      
return side;
   }


   
public long getWidth()
   
{
      
return getSide();
   }


   
public long getHeight()
   
{
      
return getSide();
   }

}


  参考文献:

阎宏,《Java与模式》,电子工业出版社
[美]James W. Cooper,《C#设计模式》,电子工业出版社
[美]Alan Shalloway James R. Trott,《Design Patterns Explained》,中国电力出版社
[美]Robert C. Martin,《敏捷软件开发-原则、模式与实践》,清华大学出版社
[美]Don Box, Chris Sells,《.NET本质论 第1卷:公共语言运行库》,中国电力出版社
http://www.dofactory.com/Patterns/Patterns.aspx



c#设计模式-总结(针对GOF23)

比较   设计模式 常用程度 适用层次 引入时机 结构复杂度 Abstract Factory 比较常用 应用级 设计时 比较复杂 Builde...
  • q317379184
  • q317379184
  • 2015年08月18日 16:24
  • 461

C#设计模式01-工厂方法模式(附源码)

在简单工厂模式中,工厂类负责创建所有产品的实例,这导致工厂类的职责太重,并且一旦工厂类无法正常工作,整个系统将会受到极大的影响,而且简单工厂模式并不能很好的符合开闭原则。为了解决简单工厂模式的这些缺点...
  • bhdxmaomi
  • bhdxmaomi
  • 2016年01月11日 12:18
  • 630

C#设计模式08-组合模式

组合模式,又称之为“部分-整体”模式,属于对象结构型模式。在介绍组合模式之前,先来看一张图片。 这是我们操作系统中资源管理器的目录结构,其中有四个文件夹,四个文件。在组合模式中,文件夹就相当于容器构...
  • bhdxmaomi
  • bhdxmaomi
  • 2016年02月17日 14:15
  • 652

C#项目中常用到的设计模式

1.引言 一个项目的通常都是从Demo开始,不断为项目添加新的功能以及重构,也许刚开始的时候代码显得非常凌乱,毫无设计可言。但是随着项目的迭代,往往需要将很多相同功能的代码抽取出来,...
  • orichisonic
  • orichisonic
  • 2016年06月23日 09:57
  • 424

Struts2框架及其设计模式

Struts2容器          容器是框架的核心,可以利用容器生成bean,也可以完成依赖注入等,这些都是容器的基本功能,Struts2容器与之前介绍的Spring容器、Springmvc容器...
  • Architect0719
  • Architect0719
  • 2016年12月28日 11:39
  • 1438

【C#设计模式-备忘录模式】

一.备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 二.备忘录模式的结构和角色: 1.Originator(...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016年05月11日 17:59
  • 5287

C#设计模式(2)

设计模式 C#
  • AndrewSpears
  • AndrewSpears
  • 2016年05月28日 18:03
  • 140

C#设计模式系列:策略模式(Strategy)

1、策略模式简介 1.1>、定义   策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,手段不同而最终达成的目标一致。客户只关心目标而不在意具体的实现方法,实现方法...
  • CsethCRM
  • CsethCRM
  • 2015年06月11日 15:58
  • 1711

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了...
  • u013472838
  • u013472838
  • 2015年04月02日 15:01
  • 693

设计模式学习之——六大设计原则之二:里氏替换原则

先讲下继承: 优点:         代码共享,代码重用,可扩展,开放性 缺点:         侵入性,降低灵活性,增强耦合性 解决继承的缺点:里氏替换! 定义1:If for each ...
  • fu222cs98
  • fu222cs98
  • 2014年03月17日 00:10
  • 1786
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#设计模式(2)
举报原因:
原因补充:

(最多只允许输入30个字)