一句话概括设计模式

设计模式的原则

单一职责原则 (Single Responsibility Principle , SRP)

  • 一个类或者模块应该有且只有一个改变的原因,也就是一个类只负责一项职责。核心就是解耦和增强内聚性,避免一项职责的改动影响了另一项职责。

开放关闭原则 (Open-Closed Principle , OCP)

  • 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。模块应尽量在不修改原(是"原",指原来的代码)代码的情况下进行扩展。

里式替换原则 (Liskov Substitution Principle , LSP)

  • 子类可以扩展父类的功能,但不能改变父类原有的功能。所有引用基类的地方必须能透明地使用其子类的对象,也可以简单理解为任何基类可以出现的地方,子类一定可以出现。子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

依赖倒置原则 (Dependence Inversion Principle , DIP)

  • 高层模块不应该依赖于低层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。核心思想就是面向接口编程。

接口隔离原则 (Interface Segregation Principle , ISP)

  • 客户端不应该依赖它不需要的接口,类间的依赖关系应该建立在最小的接口上。也就是接口尽量细化,同时接口中的方法尽量少。

合成复用原则 (Composite/Aggregate Reuse Principle , CRP)

  • 尽量使用合成复用,而不是采用继承来达到复用的目的。如果直接继承基类,会破坏封装,因为继承将基类的实现细节暴露给子类;如果基类的实现发生了改变,则子类的实现也不得不改变

迪米特法则 (Law Of Demeter)

  • 又称为最少知道原则,它表示一个对象应该对其它对象保持最少的了解。目的在于降低类之间的耦合。由于每个类尽量减少对其它类的依赖,因此。很容易使得系统的功能模块独立,相互之间不存在(或很少有)依赖关系。

创建型模式

工厂模式 (Factory Pattern)

  • 将从一个类创建一个对象的细节封装在一个工厂方法之中,调用方可以直接调用这个工厂方法进行创建而不需要关注对象创建时的具体细节,适用于复杂对象的创建和同一接口不同实现的选择等。

抽象工厂模式(Abstract Factory Pattern)

  • 当需要创建的类越来越多时,需要的工厂类也越来越多。为了避免这个问题,可以规定一个抽象工厂类(接口) 。这个抽象类里规定了一组相似类的创建方法,实现了这个抽象类就可以通过他创建一组对象,以此减少工厂类的数目。

单例模式(Singleton Design Pattern)

  • 当我们需要使得某个类只能有一个实例时,可以使用单例模式。保证一个类只能有一个实例,并提供一个全局访问点。单例模式的实现需要三个必要的条件:单例类的构造函数必须是私有的,这样才能将类的创建权控制在类的内部,从而使得类的外部不能创建类的实例;单例类通过一个私有的静态变量来存储其唯一实例;单例类通过提供一个公开的静态方法,使得外部使用者可以访问类的唯一实例。

建造者模式(Builder Pattern)

  • 建造者模式将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要用来解决"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成。"复杂对象"往往是创建参数很多,或含有大量子对象的对象。

原型模式

  • 原型模式是用于创建重复的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,通过克隆一个已有对象的方式创建。

结构型模式

适配器模式(Adapter Pattern)

  • 适配器模式是作为两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的另外一个接口。适配器主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。适配器不是在详细设计时添加的,而是解决正在服役的项目的问题,尽量避免过多使用适配器类。

桥接模式(Bridge Pattern)

  • 桥接是用于把抽象化与实现化解耦,使得二者可以独立变化。这里的桥是一个抽象化的接口,桥的一端是接口的实现类,另一端是使用这个接口的类。使用接口的类依赖的是抽象而非具体实现,从而将两者(使用的类和实现接口的类)解耦开来,使他们可以独立变化。

过滤器模式(Filter、Criteria Pattern)

  • 过滤器模式允许开发人员使用不同的标准来过滤一组对象。简单讲,就是按条件筛选一组对象出来。过滤器一般是可插拔的设计,且过滤器应具有独立性,也就是一个过滤器的状态不应该受到其他过滤器的影响。

组合模式(Composite Pattern)

  • 组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次,如计算机文件系统。组合模式定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,可以对他们进行一致的处理,其关键在于,叶子对象和组合对象实现相同的接口。

装饰器模式(Decorator Pattern)

  • 装饰器模式以对客户端透明的方式拓展现有对象的功能,是继承关系的一种替代方案。装饰器通过组合的方式使用现有对象,并实现其原有接口,实现时在调用原有对象接口的基础上,可以拓展实现新的功能,以达到"装饰"的目的。

外观模式(Facade Pattern)

  • 外观模式向现有的系统添加一个简单的接口,供客户端调用,来隐藏系统的复杂性。比如,不同视频格式的解析会用到各自格式的库,这时可以通过一个外观类将各种格式的库包装到一个函数中,供客户端调用。

享元模式(Flyweight Pattern)

  • 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象,以此减少创建对象的数量,以减少内存占用和提高性能。应确保享元对象的状态不能被修改。享元类的状态只能由构造函数的参数进行一次性初始化, 它不能对其他对象公开其设置器或公有成员变量。

代理模式(Proxy Pattern)

  • 代理接收客户端的请求并进行一些处理 (访问控制和缓存等),然后再将请求传递给服务对象。代理对象拥有和服务对象相同的接口, 这使得当其被传递给客户端时可与真实对象互换。相比装饰模式,代理模式提供的是相同功能的接口,而装饰模式提供的是加强功能的接口。

行为型模式

责任链模式(Chain of Responsibility Pattern)

  • 责任链模式中,每个处理者都包含对另一个处理者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个处理者,依此类推,形成一个处理者的链。请求沿着处理者链进行发送。 收到请求后,每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。

命令模式(Command Pattern)

  • 命令模式将请求转换为一个包含与请求相关的所有信息的独立对象。该对象实现了仅有一个执行方法的命令接口,该对象即为命令。接受者有一组成员变量来保存命令和对于实际接收者对象的调用。 发送者(调用者)使用接受者并向其发送命令请求。

迭代器模式(Iterator Pattern)

  • 迭代器模式能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下,甚至是对无法预知的数据结构遍历集合中所有的元素。重要迭代算法的代码往往体积非常庞大,他会让业务逻辑代码变得臃肿。因此,将遍历代码移到特定的迭代器中可使程序代码更加精炼和简洁。迭代器模式的关键接口是Next()HasNext()等。

中介者模式(Mediator Pattern)

  • 如果组件类之间有比较多的相互依赖,会导致依赖关系复杂,且单一组件很难复用。中介者模式中要求停止组件之间的直接交流并使其相互独立。这些组件必须调用特殊的中介者对象,通过中介者对象重定向调用行为,以间接的方式进行合作。 最终,组件仅依赖于一个中介者类,无需与多个其他组件相耦合。缺点是中介者类可能会变得复杂且难以维护。

备忘录模式(Memento Pattern)

  • 备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在适当的时候恢复对象。备忘录模式使用三个类 Memento(备忘录)、Originator(原发者) 和 CareTaker(负责人)。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。

观察者模式(Observer Pattern)

  • 观察者模式定义了对象间的一种一对多的订阅机制,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。需要将自身的状态改变通知给其他对象的称为发布者 (publisher)。所有希望关注发布者状态变化的其他对象被称为订阅者 (subscribers)。

状态模式(State Pattern)

  • 状态模式创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。状态模式将在 context 对象中需要使用大量的条件语句表示的复杂的状态变化抽取到了特定的状态中去。

策略模式(Strategy Pattern)

  • 策略模式创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。状态可被视为策略的扩展。策略使得这些对象相互之间完全独立,但状态模式没有限制具体状态之间的依赖,且允许它们自行改变在不同情景下的状态。

模板模式(Template Pattern)

  • 模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写特定方法的实现,也可以有一些默认的实现,但调用将以抽象类中定义的方式进行。模板方法基于继承机制:你可以通过扩展子类中的部分内容来改变部分算法。策略模式基于组合机制:你可以通过对相应行为提供不同的策略来改变对象的部分行为。

访问者模式(Visitor Pattern)

  • 访问者模式主要将稳定的数据结构与易变的数据操作分离。有一个访问者类,它定义了元素类的执行算法。元素对象实现接受访问者对象的一个接口,这样访问者对象就可以处理元素对象上的操作。通过这种方式,元素的执行算法可以随着访问者改变而改变。

参考资料

posted @ 2022-01-29 20:49  员力  阅读(76)  评论(0编辑  收藏  举报