别人再问你设计模式,叫他看这篇文章

简介: OOP三大基本特性封装封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏。继承继承是指这样一种能力,它可以使用现有的类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。

OOP三大基本特性

封装

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏。

继承

继承是指这样一种能力,它可以使用现有的类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。

多态

多态指一个类实例的相同方法在不同情形有不同的表现形式。具体来说就是不同实现类对公共接口有不同的实现方式,但这些操作可以通过相同的方式(公共接口)予以调用。

OOD大原则

面向对象设计(OOD)有大原则(是的,你没看错,是七大原则,不是六大原则),它们互相补充。

开-闭原则

Open-Close Principle(OCP),即开-闭原则。开,指的是对扩展开放,即要支持方便地扩展;闭,指的是对修改关闭,即要严格限制对已有内容的修改。开-闭原则是最抽象也是最重要的OOD原则。简单工厂模式工厂方法模式抽象工厂模式中都提到了如何通过良好的设计遵循开-闭原则。

里氏替换原则

Liskov Substitution Principle(LSP),即里氏替换原则。该原则规定“子类必须能够替换其父类,否则不应当设计为其子类”。换句话说,父类出现的地方,都应该能由其子类代替。所以,子类只能去扩展基类,而不是隐藏或者覆盖基类。

依赖倒置原则

Dependence Inversion Principle(DIP),依赖倒置原则。它讲的是“设计和实现要依赖于抽象而非具体”。一方面抽象化更符合人的思维习惯;另一方面,根据里氏替换原则,可以很容易将原来的抽象替换为扩展后的具体,这样可以很好的支持开-闭原则。

接口隔离原则

Interface Segration Principle(ISP),接口隔离原则,“将大的接口打散成多个小的独立的接口”。由于Java类支持实现多个接口,可以很容易的让类具有多种接口的特征,同时每个类可以选择性地只实现目标接口。

单一职责原则

Single Responsibility Principle(SRP),单一职责原则。它讲的是,不要存在多于一个导致类变更的原因,是高内聚低耦合的一个体现。

迪米特法则/最少知道原则

Law of Demeter or Least Knowledge Principle(LoD or LKP),迪米特法则或最少知道原则。它讲的是“一个对象就尽可能少的去了解其它对象”,从而实现松耦合。如果一个类的职责过多,由于多个职责耦合在了一起,任何一个职责的变更都可能引起其它职责的问题,严重影响了代码的可维护性和可重用性。

合成/聚合复用原则

Composite/Aggregate Reuse Principle(CARP / CRP),合成/聚合复用原则。如果新对象的某些功能在别的已经创建好的对象里面已经实现,那么应当尽量使用别的对象提供的功能,使之成为新对象的一部分,而不要再重新创建。新对象可通过向这些对象的委派达到复用已有功能的效果。简而言之,要尽量使用合成/聚合,而非使用继承。《Java设计模式(九) 桥接模式》中介绍的桥接模式即是对这一原则的典型应用。

设计模式

什么是设计模式

可以用一句话概括设计模式———设计模式是一种利用OOP的封闭、继承和多态三大特性,同时在遵循单一职责原则、开闭原则、里氏替换原则、迪米特法则、依赖倒置原则、接口隔离原则及合成/聚合复用原则的前提下,被总结出来的经过反复实践并被多数人知晓且经过分类和设计的可重用的软件设计方式。

设计模式十万个为什么

为什么要用设计模式

设计模式是高级软件工程师和架构师面试基本必问的项目(先通过面试进入这个门槛我们再谈其它)

设计模式是经过大量实践检验的安全高效可复用的解决方案。不要重复发明轮子,而且大多数时候你发明的轮子还没有已有的好

设计模式是被主流工程师/架构师所广泛接受和使用的,你使用它,方便与别人沟通,也方便别人code review(这个够实在吧)

使用设计模式可以帮你快速解决80%的代码设计问题,从而让你更专注于业务本身

设计模式本身是对几大特性的利用和对几大设计原则的践行,代码量积累到一定程度,你会发现你已经或多或少的在使用某些设计模式了

架构师或者team leader教授初级工程师设计模式,可以很方便的以大家认可以方式提高初级工程师的代码设计水平,从而有利于提高团队工程实力

是不是一定要尽可能使用设计模式

每个设计模式都有其适合范围,并解决特定问题。所以项目实践中应该针对特定使用场景选用合适的设计模式,如果某些场景下现在的设计模式都不能很完全的解决问题,那也不必拘泥于设计模式本身。实际上,学习和使用设计模式本身并不是目的,目的是通过学习和使用它,强化面向对象设计思路并用合适的方法解决工程问题。

设计模式有时并非最优解

有些人认为,在某些特定场景下,设计模式并非最优方案,而自己的解决方案可能会更好。这个问题得分两个方面来讨论:一方面,如上文所述,所有设计模式都有其适用场景,“one size does not fit all”;另一方面,确实有可能自己设计的方案比设计模式更适合,但这并不影响你学习并使用设计模式,因为设计模式经过大量实战检验能在绝大多数情况下提供良好方案。

设计模式太教条化

设计模式虽然都有其相对固定的实现方式,但是它的精髓是利用OOP的三大特性,遵循OOD七大原则解决工程问题。所以学习设计模式的目的不是学习设计模式的固定实现方式本身,而是其思想。

我有自己的一套思路,没必要引导团队成员学习设计模式

设计模式是被广泛接受和使用的,引导团队成员使用设计模式可以减少沟通成本,而更专注于业务本身。也许你有自己的一套思路,但是你怎么能保证团队成员一定认可你的思路,进而将你的思路贯彻实施呢?统一使用设计模式能让团队只使用20%的精力决解80%的问题。其它20%的问题,才是你需要花精力解决的。

转载请务必将下面这段话置于文章开头处(保留超链接)。

本文转发自技术世界原文链接 http://www.jasongj.com/design_pattern/summary/

相关文章
|
5月前
|
设计模式 JSON Java
设计模式下篇
设计模式下篇
24 0
|
5月前
|
设计模式 算法 前端开发
设计模式上篇
设计模式上篇
57 0
|
3月前
|
设计模式 存储 算法
设计模式笔记
设计模式笔记
|
8月前
|
设计模式 Java 关系型数据库
C++设计模式笔记
核心思想:从高层次角度讲,人们处理复杂性有一个通用的技术,及抽象。由于不能掌握全部的复杂对象,选择护士他的非本质细节,而去处理泛化和理想化的对象模型。
108 0
|
9月前
|
设计模式 算法
设计模式学习
设计模式学习
|
10月前
|
设计模式 消息中间件 Java
【Java设计模式 前言】我为什么要学习设计模式
【Java设计模式 前言】我为什么要学习设计模式
69 0
|
设计模式 存储 Java
设计模式日常学习(三)
创建者模式 二.工厂模式 在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦。 ● 简单工厂模式(不属于GOF的23种经典设计模式) ● 工厂方法模式 ● 抽象工厂模式 1.简单工厂模式 简单工厂不是一种设计模式,反而比较像是一种编程习惯。 1.1 结构 简单工厂包含如下角色: ●
72 0
|
设计模式 安全 Java
设计模式日常学习(二)
跟着黑马的视频学习设计模式总结记录 地址:BV1Np4y1z7BU 软件设计原则 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。 一.开闭原则 对扩展开放,对修改关闭。 在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。 想要达到这样的效果,我们需要使用接口和抽象类。 因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变
76 0
|
设计模式 存储 安全
设计模式日常学习(五)
五.结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: ● 代理模式 ● 适配器模式 ● 装饰者模式 ● 桥接模式 ● 外观模式 ● 组合模式 ● 享元模式 5.1.代理模式 5.1.1 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
93 0
|
存储 设计模式 算法
设计模式日常学习(七)
6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。 类图如下: public interface ILift { //电梯的4个状态 //开门状态 public final static int OPENING_STATE = 1; //关门状态 public final static int CLOSING_STATE = 2;
85 0

热门文章

最新文章