设计模式总结

  设计模式主要包括23种常用的设计模式,分为创建型(主要是对象创建时的操作)、结构性(处理类与对象间的组合)和行为性(类与对象交互中的职责分配)。我主要从实现的逻辑上阐述,其实设计模式主要是面向对象继承和多态的充分使用。

  先聊下创建型的设计模式。

       单例模式,也是设计模式中最简单了。实现方式是 (1)私有化构造方法,(2)然后通过固定的静态公共方法返回类的实列(返回的方法中先判断示例是否为null,如果是null需要new以下;考虑多线程情况,new之前还要加锁)。

      工厂方法,主要是解决子类的选择问题。首先抽象一个父类(抽象类),一组子类继承这个父类,并重写(override)父类虚方法。与业务父类对应的是一个工厂父类(也是虚拟类,里面的创建方法是返回业务父类类型),与业务子类对应的是具体的工厂子类(重写工厂父类的创建方法)。如果需要客户端调用的时候,通过工厂父类 接收 任意工厂子类的实例化。并通过工厂父类的变量去调用具体的创建方法(只需要用业务父类接口即可,通过业务父类变量可以调用业务子类的方法)。工厂方法,主要搞清楚虚拟父类的抽象,然后通过虚类对象去接收具体子类实例化,然后通过这个变量去调用里面方法(实际上是调用子类的方法)这样的话达到了去耦合。业务扩展的时候,只需要增加业务子类即可。

  抽象工厂,主要是对工厂方法的扩展。在工厂类里面,有一组方法需要执行(而不是单一的创建子类了)。理解了工厂方法后,就不难理解抽象工厂。

  建造者模式,主要包括建造者的父类(虚类)里面定义了一组方法,具体的建造者子类继承建造者父类,重写方法。建造者最重要的是有个指挥者类,可以通过方法传入建造者父类的变量(使用的时候是具体子类的实例化对象)然后控制创建过程(即可以调整方法组的先后顺序等)。实际使用过程中,我们可用根据需要创建建造者子类的实例化,然后把这些子类通过父类的变量传入给指挥者类,由指挥者决定调用的方法的次序。指挥者类的作用比较明显,可用调整方法执行顺序。建造者父类,可用约定方法组契约。

  原型模式,比较简单,在C#中就是实现IClone的接口。也就是原型拷贝内容。

       下面聊下结构性的设计模式。

       适配器模式,也就是面向接口编程。通过子类引用接口,实现接口的方法。使用的时候,定义接口变量(实际上是子类的实例化)然后调用方法即可。

       桥接模式,主要是为了将多维度变化进行分离(分而治之)。如果是两个维度的变化,主要是父类(虚拟类)在构造方法里面传入接口参数(接口也是一个维度变化)。这个模式可以理解为抽象类与接口的绑定(构造方法传入接口参数),两个维度都可以很好的变化。

  装饰模式,想到了一个成语“粉墨登场”,先定义了一个业务父类(虚类),对应一个装饰父类(虚类,有个方法传入的参数是业务父类),这样有一批具体的业务子类去继承业务父类,一批装饰子类去继承装饰父类(并重载方法)。客户端使用的时候,只要定义业务父类变量(实际上是实例化的具体子类),然后可以把这个变量给不同的装修子类使用,达到“不同的粉墨”。

  组合模式,现在学习就是虚类继承虚类,然后增加虚方法。最终实类继承第二个虚类,重写所有虚方法。组合模式,类似整体(抽象类)和部分(抽象类)的关系。

        策略模式,也类似面向接口编程。只是多了一个策略控制类,再策略控制类的构造方法里,传入接口,然后调用接口的方法。

        观察者模式,类似委托与事件。

  迭代器模式,就是支持遍历所有元素了。在.NET中实现IEnumerator接口。

     模板方法,就是父类(抽象类)约定了一组方法(抽象方法),然后到子类中实现。

  命令模式,就是两个业务类,通过命令类进行中转传递(构造方法)。

    

  

       

  

原文地址:https://www.cnblogs.com/wangyu19900123/p/8377871.html