设计模式—清晰头脑写代码赚金币
一、简单介绍一下
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。
二、四人帮GOF(全拼 Gang of Four)
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
对接口编程而不是对实现编程。
优先使用对象组合而不是继承。
三、设计模式
模式 | 包括 |
创建型模式 |
工厂模式(Factory Pattern) 单例模式(Singleton Pattern) 抽象工厂模式(Abstract Factory Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) |
结构型模式 |
适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) |
行为型模式 |
责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式(Mediator Pattern) 备忘录模式(Memento Pattern) 观察者模式(Observer Pattern) 状态模式(State Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) |
我觉得23种是对设计模式一图中里面的组成23种,那就是把这两种抽离出来了:空对象模式(Null Object Pattern) 过滤器模式(Filter、Criteria Pattern)。
有人会说了那么多的设计模式该如何去记呢?找对方法很重要。首先把设计模式稍加熟练再加上我下面这串,我相信一定会很快记住的。当然如果有更好的方法就采用更好的方法。
工单抽建原、适桥组装外享代、责命解迭中备观壮策模访。分别对应创、结、行。
四、设计模式理解
创建型模式(创建对象的模式、抽象实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑)
(1)工厂模式:
简单工厂:面向原型接口,通过对原型接口的实现,构造出多个对应的方法
抽象工厂:面向原型接口,依据传入参数,调用不同的实现类的实现方法,
静态工厂:在工厂类上使用static ,使得调用时无需new 工厂类(2)单例模式:
懒汉式:使用时再创建对象(什么时候实在快饿死了就去吃)
饿汉式:一开始创建,使用时再调用(一开始就去吃)
双重校验双重锁:多线程单例模式,采用主要采用双重校验和双重锁实现
静态内部类:java特性:程序运行时类加载器对每个类只加载一次到jvm,在静态类中率先new对象(3)建造者模式;
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示
1.使用接口,面向接口,不同的角色实现不同的接口:建造者,建造清单,单品
2.使用单个类(4)原型模式:
是用于创建重复的对象,同时又能保证性能。
浅克隆: java 提供了对浅克隆的支持:实现cloneable接口,重写clone(),方法中只需调用父类的 clone();
浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象
深克隆:实现cloneable接口和Serializable接口,重写clone(),方法中需要编写获取原对象的序列化字节码,再通过该字节码还原成深度克隆对象
结构型模式(作用于类于类之间的组合拓展)
(1)适配器模式:
是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
(2)桥接模式:
是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦
(3)组合模式:
自己本身持有自己的对象,具有层级关系的结构都可以使用该种设计模式
(4)装饰者模式:
允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。(5)外观模式:隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。通常情况下将该类设置为静态
(6)享元模式:
主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
(7)代理模式:(静态代理:知晓代理者是谁;动态代理:不知晓代理者是谁,运行时才知晓)
动态代理:
jdk动态代理(代理类实现了InvocationHandler 接口),同时实现 invoke() 方法(拦截器),方法内部通过 参数 Method 的对象调用的 invoke(被代理类对象(通过构造函数对被代理类对象进行赋值), 第三参数)的方法前后来进行增强, 同时书写一个 createproxy()方法,内部使用反射机制提供的Proxy.newintance(被代理者的类加载器,被代理者所实现的接口,拦截器);
cglib:
导入cglib依赖,创建代理类,实现 MethodInterceptor 接口,同样的也需要保存被代理类的对象,接着我们依旧创建一个方法createproxy(),不过此时的方法作用是用来对字节码进行修改,使用Enhancer 类(字节码增强器)
首先.setCallback(this);设置回调,.setSuperclass(被代理类.getClass());将被代理类作为父类,接着返回使用字节码创建的子类。接着在拦截器(intercept)方法中,第四参数.invoke(第一参数, 第三参数);在其前后可以对方法进行增强。
行为型模式 (行为型模式是对在不同的对象之间划分责任和算法的抽象化,行为型模式不仅仅关注类和对象的结构,而且重点关注他们之间的相互作用,通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象之间的交互。)
(1)责任链模式
为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。角色包含:抽象处理类(包含抽象处理方法和请求转让);实体处理类(实现对具体请求的处理);客户(只管将请求提交给责任链头)
(2)命令模式
是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。(角色:执行者,具体的命令实体,命令传递者)
(3)解释器模式
提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 角色:元数据,解释器,结果.
(4)迭代器模式
是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
包含三个角色
迭代器使用接口;包含获取迭代器的方法;
迭代器接口;包含hasNext(),next();
迭代器获取类(使用类);包含一个实现了迭代器接口的内部类(5)中介者模式
是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式
两个角色
中介者类:包含与单个类交互的方法
对象类:与中介者交互,然后中介者与另一对象类交互,最终达到对象与对象之间的交互。(6)备忘录模式
保存一个对象的某个状态,以便在适当的时候恢复对象。
(7)观察者模式
比如,当一个对象被修改时,则会自动通知依赖它的对象。
(8)状态模式
类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
角色:
抽象对象状态类:内部一般包含一个对象状态设置方法;
状态具体实现类:实现了第一个角色中的方法;
具体对象类:以该类的状态为主要作用的对象类,内部包含了状态属性(9)策略模式
一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
------------------------------------------------------
策略模式:通过改变策略对象从而达到不同的作用与效果
角色
抽象策略对象/接口:包含抽象的策略方法
实体策略对象:对上者的具体实现,不同的策略对象用于不同的实际场景
对象实体类:包含了调用策略对象方法的方法;(10)模板模式
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
-------------------------------------------------
模板模式:以抽象类的形式设计一个模板,可以用类去继承该抽象类,从而达到实现模板的效果,不同的模板有不同的实现方式角色
抽象类模板:内部定义了一些模板方法;
模板实现类;内部实现了模板抽象类的方法;(11)访问者模式
我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作
设计模式—清晰头脑写代码赚金币相关推荐
- 自己帮别人写的网站可以公开源码吗_雷军靠写代码赚第一个 100 万,马化腾亲自写腾讯网,码农出身的大佬...
作者 | 夏弢 本文经授权转载自创业邦(ID:ichuangyebang) 一提到程序员,很多人脑海里马上会出现这些刻板标签: 可事实上,有一个词似乎更能概括: 改变世界 程序改变世界,已经有几十年了 ...
- 第一篇 数据结构、设计模式与手写代码
目录 1.怎么理解时间复杂度和空间复杂度? 2.数组和链表结构简单对比? 3.怎么遍历一个树 4.冒泡排序(Bubble Sort) 5.快速排序(Quick Sort) 6.二分查找(Binary ...
- 写代码也有“套路”-谈谈设计模式
编程教室开了这么久,已经有很多人从完全零基础的小白成为了会写代码的菜鸟程序员,能够自己独立开发程序.不过到此阶段,常常会遇到瓶颈,感觉功能可以实现,但代码看起来有些别扭: 代码中有很多相似的重复代码 ...
- 浅谈设计模式 | 先有鸡还是先有蛋?先有代码后有设计模式还是先有设计模式再写代码?
前言 一.面向对象的三大特性 1. 封装 2.继承 3.多态 二.面向对象七个设计原则 1.单一职责原则 2.开放封闭原则 3.里氏替换原则 4.接口隔离原则 5.依赖倒置原则 6.合成复用原则 7. ...
- 详细讲解用Python列表for循环还有if判断语句写出1-100之内的素数,思路清晰语法准确代码简单易懂实用
详细讲解用Python列表for循环还有if判断语句写出1-100之内的素数,思路清晰语法准确代码简单易懂实用,当然还有一定技巧的算法渗透其中.请看视频: Python 代码实例,找出1-100之内的 ...
- 澎湃新闻:我在南山写代码,是改变世界还是养家糊口?
2017年12月30日,欧建新的遗体告别仪式在深圳沙湾殡仪馆举行,他的妻子带着两个孩子向他做了最后的告别,随后艰难地在火化同意书上签下了自己的名字.20天前,这位研发工程师从他就职的中兴公司通讯研发大 ...
- CTO集体怒吼:我到底要不要继续写代码(下篇)
http://www.devstore.cn/new/newInfo/4708.html 5.在人人创业的时代里,竞争压力非常大.有很多产品,甚至会有多个竞争对手,那么产品技术和布局会非常重要.CTO ...
- 写代码之前应该做的几件事
作者:borisyang,腾讯 WXG 应用开发工程师 作为程序员,刚刚开始学会写代码,常常是接过需求就开始撸代码.有时候发现,写完代码,需求变了.更多时候,觉得写业务代码枯燥无聊,没有技术含量.另外 ...
- 15岁中国学生斩获苹果WWDC奖学金:写代码只用了2个周末
转自:新智元 编辑:鹏飞.金磊 [新智元导读]自古英雄出少年!15岁00后开发者获WWDC 2019奖学金并受邀参会.WWDC奖学金用于奖励有才华的学生和STEM组织成员,并有机会参加WWDC大 ...
最新文章
- IP地址和MAC地址
- java OpenCV 图片清晰度、色偏和亮度检测
- 使用证书保护网站--兼谈证书服务器吊销列表的使用
- C# Azure 存储-分布式缓存Redis的新建配置查看
- nodejs渐入佳境[8]-json处理
- Android源代码下载方法具体解释
- sqlite3的编译和使用
- 网页设计表格单元格线条及边框设置
- 用python写一个文件管理程序下载_Python管理文件神器 os.walk
- 使用WebBrowser自动登录阿里妈妈网站
- php单例模式代码,php设计模式之单例模式代码
- 简约却不简单的科学原理闲谈(A Talk:Principles with simplicity but complicacy)
- 英语单词词性顺口溜_英语十大词性口诀
- 从零开始了解 kubernetes,还有谁不会?
- 黑月MySQL_黑月编译器插件
- 英文pdf翻译为中文(word+google浏览器即可)
- 银河麒麟V10 远程桌面
- 迅雷协议分析–多链接资源获取
- linux tar exclude 多个目录,tar 过滤多个文件目录 打包
- 颓废的人怎样振奋精神_5个令人振奋的行业,从事数据科学家在科技行业以外的工作...