![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
7大原则和23种设计模式
文章平均质量分 77
jsxllht
总有人要成功,为什么不能是你
展开
-
责任链模式(Chain of Responsibility Pattern)
责任链模式顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。案例一:传统模式学校OA系统的采购审批项目:需求是采购员采购教学器材如果金额小于等于5000,由教学主任审批(0<=x<=5000)如果原创 2022-02-16 15:21:41 · 810 阅读 · 0 评论 -
策略模式(Strategy Pattern)
模式在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。策略模式( Strategy Pattern) 中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对原创 2022-02-16 14:21:29 · 604 阅读 · 0 评论 -
状态模式(State Pattern)
状态模式在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类案例APP 抽奖活动问题假如每参加一次这个活动要扣除用户50积分,中奖概率是10%奖品数量固定原创 2022-02-16 13:33:30 · 408 阅读 · 0 评论 -
解释器模式(Interpreter Pattern)
解释器模式解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器解释器模式是指给定一一个语言(表达式),定义它的文法的一种表示,并定义一个解释器使用该解释器来解释语言中原创 2022-02-16 10:51:24 · 314 阅读 · 0 评论 -
备忘录模式(Memento Pattern)
备忘录模式备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。在不破坏封装性的前提下,捕获-一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行原创 2022-02-16 09:27:09 · 261 阅读 · 0 评论 -
中介者模式(Mediator Pattern)
中介者模式中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。用一个中介对象来封装一 系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互中介者模式属于行为型模式,使代码易于维护比如MVC模式,C (Controller 控制器)是M (Model 模型)和V (View 视图)的中介者,在前后端交互时原创 2022-02-15 21:46:52 · 197 阅读 · 0 评论 -
观察者模式(Observer Pattern)
观察者模式当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。案例一天气预报需求气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)需要设计开放型API,便于其他第三方也能接入气象站获取数据提供温度、气压和湿度的接口测量数据更新时, 要能实时的通知给第三方/** * 核心类 * 1. 包含最新的天气情况信息 * 2. 含有 Cur原创 2022-02-15 20:32:16 · 132 阅读 · 0 评论 -
迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。如果我们的集合元素是用不同的方式实现的,有数组,还有java 的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露原创 2022-02-15 19:18:02 · 119 阅读 · 0 评论 -
访问者模式(Visitor Pattern)
访问者模式在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题访问者模式的基本工原创 2022-02-15 16:03:28 · 189 阅读 · 0 评论 -
命令模式(Command Pattern)
命令模式介绍命令模式 (Command Pattern) :在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦在命名 模式中,会将一个请求封装为-一个对象,以便使用不同参数来表示不同的请求(即命名),同时命令模式也支持可撤销的操作通俗易懂的理解:将军发布命令,士兵去执行。其中有原创 2022-02-15 14:58:51 · 118 阅读 · 0 评论 -
模板方法模式(Template Method Pattern)
模板方法模式介绍模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern), 在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤模板方法模式属于行为型模式。案例一:模板方法模式编写制作豆浆的程序如下:制作豆浆的流程选材-- 添加配料–浸泡–放原创 2022-02-15 11:45:02 · 307 阅读 · 0 评论 -
代理模式(Proxy)
代理模式介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代理模式有不同的形式,主要有三种静态代理、动态代理(JDK 代理、接口代理)和Cglib 代理(可以在内存动态的创建对象,而不需要实现接口,他是属于动态代理的范畴)静态代理静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一-起实现相同原创 2022-02-15 10:17:16 · 1301 阅读 · 0 评论 -
享元模式(Flyweight Pattern)
展示网站项目需求小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同:有客户要求以新闻的形式发布有客户人要求以博客的形式发布有客户希望以微信公众号的形式发布案例一:直接复制粘贴一份直接复制粘贴一份,然后根据客户不同要求,进行定制修改给每个网站租用一个空间缺点需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对象很多,造成服务器的资源浪费案例二:享元模式享元模式原创 2022-02-14 19:15:26 · 483 阅读 · 0 评论 -
外观模式(Facade Pattern)
外观模式外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。影院管理项目组建一个家庭影院:DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为:直接用遥控器:统筹各设备开关开爆米花机放下屏幕开投影仪开音响开DVD,选dvd去拿爆米花调暗灯光播放观影结束后,关闭各种设备案例一:传统方式解决影院管理总结在原创 2022-02-14 16:58:58 · 117 阅读 · 0 评论 -
组合模式(Composite Pattern)
组合模式组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。案例一:学校院系展示需求编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成, 一个学校有多个学院,一个学院有多个系。将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的实际上我们的要求是:在一个页面中展示出学校的原创 2022-02-14 15:56:54 · 405 阅读 · 0 评论 -
装饰器模式(Decorator Pattern)
装饰者设计模式星巴克咖啡订单项目(咖啡馆)咖啡种类/单品咖啡: Espresso(意 大利浓咖啡)、ShortBlack、 LongBlack(美 式咖啡)、Decaf(无因咖啡)调料: Milk、 Soy(豆 浆)、Chocolate要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便使用0O的来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以单品咖啡+调料组合方案1-解决星巴克咖啡订单问题分析Drink 是一个抽象类,表示饮料2)des就是对咖啡的描述,比如咖啡的名原创 2022-02-14 11:22:03 · 112 阅读 · 0 评论 -
桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern)桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。案例一public abstract class Phone { protected void open() { this.open(); } protected void close()原创 2022-02-06 18:00:30 · 464 阅读 · 0 评论 -
适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern)适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协原创 2022-01-30 11:17:49 · 137 阅读 · 0 评论 -
建造者模式(Builder Pattern)
建造者模式(Builder Pattern)建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。案例一:传统模式(建房案例)public abstract class AbstractHouse { //打地基 public abstract void buildBasic(); //砌墙 public abstract void buildWalls(); //封顶 public abstract void roof原创 2022-01-30 09:15:08 · 708 阅读 · 0 评论 -
原型模式(Prototype Pattern)
原型模式(Prototype Pattern)原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。克隆羊问题现在有一只羊tom,姓名为: tom,年龄为: 1, 颜色为:白色,请编写程序创建和tom羊属性完全相同的10只羊。案例一:传统方式public class Sheep { private String name; private int age; private String colo原创 2022-01-29 16:16:43 · 9405 阅读 · 6 评论 -
工厂模式 (Factory Design Pattern)
工厂模式 (Factory Design Pattern)案例一:订购披萨(传统写法)//将Pizza 类做成抽象public abstract class Pizza { protected String name; //名字 //准备原材料, 不同的披萨不一样,因此,我们做成抽象方法 public abstract void prepare(); public void bake() {System.out.println(name + " baking;");} public void原创 2022-01-29 14:17:04 · 158 阅读 · 0 评论 -
单例设计模式(Singleton Design Pattern)
单例设计模式(Singleton Design Pattern)所谓类的单例设计模式,就是采取一定 的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。比如Hibernate的SessionFactory,它充当数据存储源的代理,并负贵创建Session对象。SessionFactory 并不是轻量级的,一般情况下,一个项日通常只需要一个SessionFactory就够,这是就会使用到单例模式。单例设计模式八种方式饿汉式(静态常量)饿汉原创 2022-01-29 09:31:35 · 252 阅读 · 0 评论 -
合成复用原则及UML类图
合成复用原则合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)原则是尽量使用合成/聚合的方式,而不是使用继承找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。针对接口编程, 而不是针对实现编程。交互对象之间松耦合设计UML类图1)idea安装插件 PlantUML2)下载并安装graphviz下载地址:http://www.原创 2022-01-28 16:09:50 · 1190 阅读 · 0 评论 -
迪米特法则
迪米特法则迪米特法则(Law of Demeter,缩写是 LOD)又叫最小知道原则 (The Least Knowledge Principle)Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to stran原创 2022-01-27 20:15:34 · 406 阅读 · 0 评论 -
开闭原则OCP
开闭原则(Open Closed Principle,简写为 OCP)software entities (modules, classes, functions, etc.) should be open for extension ,but closed for modification。软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”。案例一public class Ocp { public static void main(String[] args) { //使用看看存原创 2022-01-27 17:15:43 · 150 阅读 · 0 评论 -
里氏替换原则
里氏替换原则(Liskov Substitution Principle)Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it。子类对象(object of subtype/derived class)能够替换程序(program)中父类对象(object of base/parent class)出现的任何地方原创 2022-01-27 16:51:49 · 97 阅读 · 0 评论 -
依赖倒转原则
依赖倒转原则(Dependence Inversion Principle)High-level modules shouldn’t depend on low-level modules. Both modules should depend on abstractions. In addition, abstractions shouldn’t depend on details. Details depend on abstractions.高层模块(high-level modules)不要依赖原创 2022-01-27 16:26:05 · 423 阅读 · 0 评论 -
接口隔离原则
接口隔离原则(Interface Segregation Principle,缩写为 ISP)Clients should not be forced to depend upon interfaces that they do not use客户端不应该强迫依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口案例一public class Segregation1 { public static void main(String[] args) { }}//接口in原创 2022-01-27 11:28:14 · 247 阅读 · 0 评论 -
单一职责原则
单一职责原则( Single Responsibility Principle,缩写为 SRP)A class or module should have a single reponsibility。一个类或者模块只负责完成一个职责(或者功能)。这个原则描述的对象包含两个,一个是类(class),一个是模块(module)1)把模块看作比类更加抽象的概念,类也可以看作模块。2)把模块看作比类更加粗粒度的代码块,模块中包含多个类,多个类组成一个模块。案例一public class Single原创 2022-01-27 10:46:49 · 158 阅读 · 0 评论