具体的UML结构图如下所示: 3.4 建造者模式 建造者模式指的是将一个产品的内部表示与产品的构造过程分割开来

时间:2022-01-29 07:27:22

  颠末这段时间对设计模式的学习,本身的感触还是很多的,因为我此刻在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构。所以,学完设计模式之后,觉得它会慢慢地影响到你写代码的思维方法。这里对设计模式做一个总结,一来可以对所有设计模式进行一个梳理,二来可以做一个索引来辅佐大家保藏。

  PS: 其实,很早之前我就看过所有的设计模式了,但是并没有写博客,但是不久就很快忘记了,也没有起到什么感化,此次以博客的形式总结出来,发明效果还是很明显的,因为通过这种总结的方法,我对它理解更深刻了,也记住的更牢靠了,也影响了本身平时实现成果的思维。所以,我鼓励大家可以通过做条记的方法来把本身学到的对象进行梳理,这样相信可以理解更深,更好,我也会一直写下来,之后筹算写WCF一系列文章。

  其实WCF内容很早也看过了,并且博客园也有很多前辈写的很好,但是,我感受我还是需要本身总结,因为只有这样,常识才是本身的,别人写的多好,你看了之后,其实还是别人了,所以鼓励大家几点(对付这几点,也是对本身的一个提醒):

要动手实战别人博客中的例子;

实现之后进行总结,可以写博客也可以本身记录云条记等;

想想能不能进行扩展,进行触类旁通。

二、 设计原则

  使用设计模式的根来源根底因是适应变革,提高代码复用率,使软件更具有可维护性和可扩展性。并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则、开放关闭原则、里氏取代原则、依赖颠倒原则、接口断绝原则、合成复用原则和迪米特法例。下面就分袂介绍了每种设计原则。

2.1 单一职责原则

  就一个类而言,应该只有一个引起它变革的原因。如果一个类承当的职责过多,就即是把这些职责耦合在一起,一个职责的变革可能会影响到其他的职责,此外,把多个职责耦合在一起,也会影响复用性。

2.2 开闭原则(Open-Closed Principle)

  开闭原则即OCP(Open-Closed Principle缩写)原则,该原则强调的是:一个软件实体(指的类、函数、模块等)应该对扩展开放,对改削*。即每次产生变革时,要通过添加新的代码来增强现有类型的行为,而不是改削原有的代码。

  切合开闭原则的最好方法是供给一个固有的接口,然后让所有可能产生变革的类实现该接口,让固定的接口与相关东西进行交互。

2.3 里氏取代原则(Liskov Substitution Principle)

  Liskov Substitution Principle,LSP(里氏取代原则)指的是子类必需替换失它们的父类型。也就是说,在软件开发过程中,子类替换父类后,措施的行为是一样的。只有当子类替换失父类后,此时软件的成果不受影响时,父类才华真正地被复用,而子类也可以在父类的根本上添加新的行为。为了就来看看违反了LSP原则的例子,具体代码如下所示:

public class Rectangle { public virtual long Width { get; set; } public virtual long Height { get; set; } } // 正方形 public class Square : Rectangle { public override long Height { get { return base.Height; } set { base.Height = value; base.Width = value; } } public override long Width { get { return base.Width; } set { base.Width = value; base.Height = value; } } } class Test { public void Resize(Rectangle r) { while (r.Height >= r.Width) { r.Width += 1; } } var r = new Square() { Width = 10, Height = 10 }; new Test().Resize(r); }

  上面的设计,正如上面注释的一样,在执行SmartTest的resize要领时,如果传入的是长方形东西,当高度大于宽度时,会自动增加宽度直到超过高度。但是如果传入的是正方形东西,则会陷入死循环。此时根来源根底因是,矩形不能作为正方形的父类,既然呈现了问题,可以进行重构,使它们俩都担任于四边形类。重构后的代码如下所示:

// 四边形 public abstract class Quadrangle { public virtual long Width { get; set; } public virtual long Height { get; set; } } // 矩形 public class Rectangle : Quadrangle { public override long Height { get; set; } public override long Width { get; set; } } // 正方形 public class Square : Quadrangle { public long _side; public Square(long side) { _side = side; } } class Test { public void Resize(Quadrangle r) { while (r.Height >= r.Width) { r.Width += 1; } } static void Main(string[] args) { var s = new Square(10); new Test().Resize(s); } }

2.4 依赖颠倒原则