![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 71
参宿_七
格物致知
展开
-
1. 适配器模式
一、类适配器接口A:我的手机接口A的methodA方法:我的手机上的数据接口接口B:我的电脑接口B的methodB方法:我的电脑上的数据接口我的手机与电脑不能直接数据通信:我的手机不能从我的电脑的接口上发出数据或者接收数据。这时,我有一根数据线,它一头是手机接口的样子,一头是电脑接口的样子,两个接口都有了。那么自己身上的两个东西当然随便用啦,于是数据线把手机接口改了一点...原创 2019-05-10 19:20:37 · 139 阅读 · 0 评论 -
14. proxy pattern 代理模式
适用情境:某些对象由于性能原因、安全控制原因、分布式原因等不是很容易获得它的对象。定义:代理模式通过增加一层间接层,间接地控制对象,对外部使用者来说,一般没有任何区别,但是Proxy类的同名方法中却要做很多事情来解决性能、安全控制或是分布式等原因造成的问题。代理模式并不一定完全透明(用户使用完全一致),主要是实现间接控制。结构:增加一层间接层,是很多问题的解决方法。其实字符串的...原创 2019-09-17 10:57:12 · 190 阅读 · 0 评论 -
15. Mediator Pattern 中介者模式
要解决的问题:当一个程序中的多个对象之间要互相访问数据,就会产生非常紧密的耦合关系。解决方法:在这些对象之间设计一个中介者,将所有的数据都存储于这个终结类中,那么读写都从中介类中读写。其实这个与门面模式很像,但是门面模式是解决两个对象直接的紧耦合,中介者模式是解决多个对象之间的紧耦合。最近在写的一个目测角度的游戏恰好就涉及到这个问题,我的多个对象之间要互相访问数据,导致紧耦合,而且比较...原创 2019-09-17 15:04:54 · 133 阅读 · 0 评论 -
16. State Pattern 状态模式
在软件构建过程中,对象状态的改变,其行为也会发生改变。在不同的状态下,进行相同的操作,会有不同的响应,这种对于不同的状态进行不同的响应就会有很多if else来判断当前的状态。这和策略模式面临的问题很像。当有新的状态出现时,就要在后面再加else if。这就违背开闭原则。与策略模式相同,将枚举类型提取为一个抽象基类。所有与状态相关的操作提取为抽象基类的方法。每个枚举值(状态)提取为一个子类,那...原创 2019-09-17 15:26:24 · 165 阅读 · 0 评论 -
17. Memento Pattern 备忘录
要解决的问题:在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态,比如PS的撤回功能,还有之前写联棋的悔棋功能。如果使用共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。如何实现对象状态的良好保存与恢复,但又不会因此而破坏对象本身的封装性?定义:在不破坏封装性的前提下,捕获对象的内部状态,在对象之外保存这个状态,这样以后就可以...原创 2019-09-17 15:58:10 · 201 阅读 · 0 评论 -
18. Composite Pattern 组合模式
使用List与多态将对象组合成树形结构,Composite使得用户对单个对象和组合对象的使用具有一致性。List中的对象可能是中间结点也可能是叶子结点,而中间结点中也包含一个List,它们都继承自同一基类。这就是树形结构。不管是中间结点还是叶子结点都继承自同一基类,所以它们有一个方法的不同实现,当调用根节点的该方法时,根节点会循环调用List对象中所有对象的该方法。如果该对象是中间结点,则...原创 2019-09-17 16:27:31 · 188 阅读 · 0 评论 -
19. Iterator Pattern 迭代器模式
动机:在软件构建过程中,集合对象内部结构常常变化各异,但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素,同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”。定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部表示。结构:但是对于...原创 2019-09-18 09:56:47 · 238 阅读 · 0 评论 -
20. Chain of Resposibility 职责链模式
动机:在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。如何使请求的发送者不需要指定具体的接受者,让请求的接受者自己在运行时决定来处理请求从而是两者解耦?定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条单向链,并沿着这条链传递请求,直到有一个对象处理它...原创 2019-09-18 10:13:13 · 215 阅读 · 0 评论 -
21.Command Pattern 命令模式
动机:将组件的行为与组件本身解耦。其实一个类相当于一个组件,而其中的方法相当于行为,两者的耦合程度是非常紧密的。为了将两者解耦,则将每个行为定义成一个类,也就是一个类中只有一个方法,这个方法表示一个行为或是一个步骤。当某个流程需要多个步骤,或者说是多个命令时,建立每个命令的类的对象,将这些命令转载到流程List中。或是将一个命令对象作为参数传递给客户端程序执行。命令作为对象的好处是,对象可以作为参...原创 2019-09-19 18:11:27 · 166 阅读 · 0 评论 -
22. Visitor Pattern 访问器模式
动机:在软件构建过程中,由于需求的变化,某些类层次结构(父类、子类)中添加新的行为。如果直接在基类中更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改原有类的情况下,透明地为类层次结构添加新行为。定义:表示一个作用于某对象结构中的各元素的操作,使得可以在不改变各个元素的类的前提下扩展这些元素的新操作。结构图:总结:visitor模式通过双重分发,来实现在不更改el...原创 2019-09-19 19:12:23 · 146 阅读 · 0 评论 -
23.Interpreter Pattern 解析器模式
在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这种时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。动机:在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化,在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。定义:给...原创 2019-09-19 19:39:50 · 205 阅读 · 0 评论 -
13.Facade Pattern 门面模式
门面模式其实不是一种代码模式,而是一种设计思想,设计原则,根据这种思想设计出来的程序,模块与模块之间具有松耦合性。门面模式是连接两个对象之间的中介,两个对象的交流都通过这个中介传递。其实广义上的门面模式有很多体现,如原始的计算机不存在软件,人直接控制硬件,后面才有软件,软件就是人与硬件的中介,这就是门面模式。进一步划分,操作系统又是软件与硬件的中介,而虚拟机等又是软件与操作系统的中介。在代...原创 2019-09-17 10:27:06 · 117 阅读 · 0 评论 -
8. Factory Pattern 工厂模式
工厂模式是为了解决在类与类之间组合需要用到new来产生对象,从而导致的类之间紧耦合关系的问题。比如一个抽象出来的分割器,它可能是文件分割器、图片分割器、视频分割器等,如果在button的响应事件中写:void onClick(){Splite splite=new FileSplite();splite.execu();}在编译这个方法时,必须得现有FileSplite类...原创 2019-06-28 15:30:47 · 164 阅读 · 0 评论 -
12. Flyweight Pattern 享元模式
运用共享技术有效地支持大量(几万几十万)细粒度的对象。比如string、线程池,虽然实现方式可能和享元模式有区别,但是思想是一样的。享元模式的结构图:比如创建字体对象,假设一篇文章有几万字,但其实只有3种字体,我们不需要为每一个字都创建一个字体对象,让相同字体的字共享一个字体。但是字体对象创建出来就是只读的,因为有多个地方引用了这个对象,一改则全改。享元模式在创建对象时...原创 2019-07-09 16:06:10 · 180 阅读 · 0 评论 -
设计模式综述
设计模式的主要目的是应对变化,实现代码的复用,就是当一个软件写好了,发布了,但是要迭代更新,如何在不更改整体架构的情况下实现或扩展功能。设计模式总结了大部分问题的答案思路,并为每个答案命名,这样每次遇到相同的问题都可以复用总结的答案。设计模式也是一种架构,是基于面向对象的类的架构,一般的系统架构是模块的架构。设计模式的思想,也就是得到这个答案的思想是在稳定中找到变化,然后如何使得这个变...原创 2019-06-21 17:42:42 · 178 阅读 · 0 评论 -
2. Template Method(模板方法)
当一个算法分成很多步骤时,其中有些步骤是固定不变的,有些步骤是会变化的。那么一般的想法是直接把每一步都作为一个方法写出来,然后在主方法中调用:class Steps { void func0() { // 具体实现 } void func1() { // 具体实现 } void func2() { // 具体实现 } void func3() { // 具...原创 2019-06-21 21:55:25 · 138 阅读 · 0 评论 -
3. Strategy Pattern(策略模式)
当有一个算法(广义上的),它的功能是确定的,具体实现要视具体情况而定,比如计算不同国家税的算法,具体实现得看是哪个国家,那么一般想到的做法是用if-else或者switch-case来判断值,调用不同的计算函数:class CountFuncs{ void func1() { //具体实现 } void func2() { //具体实现 } void func3() { ...原创 2019-06-21 22:38:04 · 117 阅读 · 0 评论 -
5. Singleton Pattern 单例模式—饿汉、懒汉与迭代后的懒汉
单例模式主要符合单一职能原则。当一个类的职责是一定的,而且整个程序中不需要生成第二个此类的对象,而且如果生成第二个此类的对象的话还会有问题(比如我之前写的联棋游戏,里面的棋盘就应该始终只有一个对象,如果有两个会造成混乱),为了防止生成两个对象,而且节约内存,会使用单例模式。使用单例模式的典型场景比如数据库连接类,游戏主流程控制类等。解决思路:1.不允许其他程序使用new创建该类对象。(别人...原创 2019-06-26 19:35:22 · 300 阅读 · 0 评论 -
6. Decorator Pattern 装饰器模式
装饰器模式总结:动态(用组合代替继承,在运行时赋子类)地给一个对象增加一些额外的职责。适用情况:过度地使用继承来扩展对象的功能(功能之间的组合也需要很多类来实现)导致子类的膨胀。当一个父类下面有很多相似的子类,而且子类又衍生出很多子类,如:Stream生出子类:FileStream/NetWorkStream/MemeryStream这些子类,每个又需要添加一些功能,比如加...原创 2019-06-26 21:18:16 · 171 阅读 · 0 评论 -
4. Observer/Event Pattern(观察者模式)—C#/C++/JAVA中的实现与区别
观察者模式是为了实现类与类之间的松耦合,具体作用都是当一个事件发生时,调用所有响应方法。感觉观察者模式在c#、c++、java语言中的适用情况与意义是不一样的。一、在c#中:当一个事情发生了,多个观察者将出现反应。如人物被攻击这件事情发生了,则人物要播放被攻击动画,边上要显示攻击值,被攻击的人物要减少血量等等。对于这样的情况,我们一般的做法是,当某件事情发生时,则生成这些类的对象,逐个...原创 2019-06-26 14:05:49 · 318 阅读 · 0 评论 -
9. Abstract Factory 抽象工厂模式
和工厂模式解决的问题的不同之处是,抽象工厂创建的是一系列相互依赖的对象。比如连接数据库、生成查询语句、执行语句三个接口,对于不同的数据库类型,要生成不同的子类。因为是面向接口的编程,所以在主框架中不能出现new,所以想到工厂模式,对于每个接口都要创建相关的工厂类,在工厂类中创建子类的对象,但这三个类是相互依赖的,如果是访问mysql数据库,那么三个都得生成mysql相关的类,如果其中一个与...原创 2019-07-08 18:42:47 · 206 阅读 · 0 评论 -
10. Prototype Pattern 原型模式—克隆一个已有的对象
原型模式将工厂模式中 抽象功能的接口 与 创建该接口的工厂接口 合二为一,不再需要工厂。也就是抽象功能的接口包含了一个函数,在这个函数创建自己,这个函数称为克隆,这个接口生成的对象成为原型对象。原型对象(原型其实是个接口,原型对象其实是该接口子类的对象)只供调用克隆方法。使用的时候通过调用原型对象的克隆方法得到一个新对象,再使用这个新对象的方法。听到创建自己,很容易想到,这不就是构造器吗?...原创 2019-07-08 19:13:48 · 194 阅读 · 0 评论 -
11. Builder Pattern 构建器模式—在内部类中设置成员变量
一、问题:在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成。由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。这个描述和模板方法模式很相似,但是这个模式主要解决创建工作。比如创建房子,步骤是一样的,但是每个步骤的具体实现时不一样的。我们可以将对象的表示与创建部分相分离,使其可以用相同...原创 2019-07-08 20:23:24 · 267 阅读 · 0 评论 -
7. Bridge Pattern 桥模式
意图;将抽象部分与它的实现部分分离,使它们可以独立地变化。当一个类有两个或多个发展方向时,比如一个软件A,要有PC版、ios版、安卓版,同时每个版又分为经典版、完美版等。如果单纯使用多继承来实现,就是这样:这样做的话有两个问题:1. 类的个数是1+n+n*m个,类很多而且各个经典版本之间很多代码重复2. 违背单一职责原则,一个类应该只有一个使其变化的原因,而这里有两个,这两个变...原创 2019-06-28 14:39:35 · 171 阅读 · 0 评论 -
24.设计模式总结
目标:管理变化、提高复用手段:分解(知道类之间的不同)、抽象(知道类之间的共同点)八大原则:参考第一篇重构技法:静态->动态早绑定->晚绑定继承->组合编译时依赖->运行时依赖紧耦合->松耦合组合优于继承,是指组合对象指针优于继承类,如果不是指针,那么组合和继承在内存上是一样的。所有模式都要关注稳定点与变化点,封装隔离变化。...原创 2019-09-19 20:01:47 · 114 阅读 · 0 评论