《设计模式笔记》由会员分享,可在线阅读,更多相关《设计模式笔记(21页珍藏版)》请在金锄头文库上搜索。
1、一、开放封闭原则(OCP)Open-Closed Principle 原则讲的是:一个软件实体应当对扩展开放,对修改关闭二、 里氏代换原则(LSP)Liskov Substitution Principle(里氏代换原则):子类型 (subtype)必须能够替换它们的基类型。三、 依赖倒置原则(DIP) 依赖倒置(Dependence Inversion Principle)原则讲的是: 要依赖于抽象,不要依赖于具体。抽象不应当依赖于细节;细节应当依赖于抽象;要针对接口编程,不针对实现编程。四、 接口隔离原则(ISP)接口隔离原则(Interface Segregation Principle
2、)讲的是:使用多个专门的接口比使用单一的总接口总要好。换而言之,从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小接口上的。实现方法:1、 使用委托分离接口2、 使用多重继承分离接口五、 合成/聚合复用原则(CARP)合成/聚合复用原则(Composite/Aggregate Reuse Principle 或 CARP)经常又叫做合成复用原则(Composite Reuse Principle 或 CRP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。简而言之,要尽量使用合成/聚合,尽量不要使用继承。区分
3、Has-A与Is-AIs-A是严格的分类学意义上定义,意思是一个类是另一个类的一种。而Has-A则不同,它表示某一个角色具有某一项责任。六、 迪米特法则(LoD)迪米特法则(Law of Demeter 或简写 LoD)又叫最少知识原则(Least Knowledge Principle或简写为 LKP),也就是说,一个对象应当对其它对象有尽可能少的了解。迪米特法则与设计模式Facade 模式、Mediator 模式创建型模式种类 Singleton 单例模式,保证一个类仅有一个实例 Factory Method 工厂方法模式,定义一个创建对象的接口,并控制用哪一个类进行实例化 Abstrac
4、t Factory抽象工厂模式,创建一系列相关或相互依赖的对象 Prototype原型模式,通过拷贝现有对象来生成新对象(克隆方法) Builder生成器模式,将构造对象实例的代码逻辑移到类的外部结构型模式 结构型模式涉及到如何组合类或对象,以获得更大的结构 结构型类模式采用继承机制来组合接口或实现 结构型对象模式描述了如何对一些对象进行组合,从而实现新功能的一些方法Adapter 适配器模式,将一个类的接口转换成客户希望的另外一个接口 ,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器(Adapter )模式桥梁(Bridge)模式,将抽象部分与它的实现部分分离,使它们都可以
5、独立地变化 Composite 组合模式,将对象组合成树形结构以表示“部分 -整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 合成(Composite) 模式 Decorator 装饰模式,动态地给一个对象添加一些额外的职责 装饰(Decorator)模式 Facade 外观模式,为子系统中的一组接口提供一个一致的界面,使得这一子系统更加容易使用 Flyweight 享元模式,运用共享技术有效地支持大量细粒度的对象 享元(Flyweight )模式 Proxy 代理模式,为其他对象提供一种代理以控制对这个对象的访问 代理(Proxy)模式行为型模式 行为型模式涉及到算法和对象间
6、职责的分配 行为型模式不仅描述对象或类的模式,还描述它们之间的通信模式,将注意力转移到对象间的联系方式上来行为型模式种类 Chain of responsibility 职责链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系 职责链(Chain of Responsibility)模式 Command 命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作 Interpreter 解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子 Iterat
7、or 迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示 Mediator 中介者模式,用一个中介对象来封装一系列的对象交互 Memento 备忘录模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态 Observer 观察者模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新(事件) State 状态模式,允许一个对象在其内部状态改变时改变它的行为 Strategy 策略模式,定义一系列的算法,把它们一个个封装起来, 并且使它们可
8、相互替换 TemplateMethod 模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中(使用继承,把公共的方法放到基类就属于模板) Visitor 访问者模式,表示一个作用于某对象结构中的各元素的操作 简单工厂(Simple Factory)模式 工厂方法(Factory Method)模式 抽象工厂(Abstract Factory)模式五、 优点与缺点:优点:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅消费产品。简单工厂模式通过这种做法实现了对责任的分割。缺点:当产品有复杂的多层等级结构时,工厂类只有自
9、己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。Simple Factory 模式角色与结构:Factory Method 模式角色与结构:工厂方法模式与简单工厂模式工厂方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。抽象工厂(Abstract Factory)模式抽象工厂模式是所
10、有形态的工厂模式中最为抽象和最具一般性的一种形态。为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。 在什么情形下使用抽象工厂模式:在以下情况下应当考虑使用抽象工厂模式: 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。 这个系统有多于一个的产品族,而系统只消费其中某一产品族。 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。开放封闭原则开放封
11、闭原则要求系统对扩展开放,对修改封闭。通过扩展达到增强其功能的目的。对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:增加产品族:Abstract Factory 很好的支持了开放封闭原则。增加新产品的等级结构:需要修改所有的工厂角色,没有很好支持开放封闭原则。综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。单例(Singleton )模式Singleton 拥有一个私有构造函数,确保用户无法通过 new 直接实例它。除此之外,该模式中包含一个静态私有成员变量 instance 与静态公有方法
12、Instance()。注意:不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中。不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton 模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。sealed class Singletonprivate Singleton();public static readonly Singleton Instance=new Singleton();Singleton 类被声明为 sealed,以此保证它自己不会被继承。也有一些问题
13、,比如无法继承,实例在程序一运行就被初始化,无法实现延迟初始化等 建造者(Builder)模式public static void Main( string args )/ Create director and buildersDirector director = new Director( );Builder b1 = new ConcreteBuilder1();Builder b2 = new ConcreteBuilder2();/ Construct two productsdirector.Construct( b1 );Product p1 = b1.GetResult();
14、p1.Show();director.Construct( b2 );Product p2 = b2.GetResult();p2.Show();在什么情况下使用建造者模式以下情况应当使用建造者模式:1、 需要生成的产品对象有复杂的内部结构。2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。使用建造者模式主要有以下效果:1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。2、 每一个 Builder 都相对独立,而与其它的 Bui
15、lder 无关。3、 模式所建造的最终产品更易于控制。原型(Prototype )模式原型模式的用意是:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。说白了就是每个类加个 clone 方法用于复制自身对象(实现ICloneable 接口,实现其方法即可)。在 C#里面,我们可以很容易的通过 Clone()方法实现原型模式。任何类,只要想支持克隆, 必须实现 C#中的 ICloneable 接口。ICloneable 接口中有一 Clone 方法,可以在类中复写实现自定义的克隆方法。克隆的实现方法有两种:浅拷贝(shallow copy)与深拷
16、贝(deep copy)。抽象原型(Prototype )角色:这是一个抽象角色,通常由一个 C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在 C#中,抽象原型角色通常实现了 ICloneable 接口适配器(Adapter)模式适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式有类的适配器模式和对象的适配器模式两种。类的 Adapter 模式的结构:Adapter 类实现了 Target 接口,并继承自 Adaptee,Adapter 类的 Request 方法重新封装了Adaptee 的 SpecificRequest 方法,实现了适配的目的。public void Request()this.SpecificRequest();对象的 Adapter 模式的