![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 91
设计模式是一种软件设计思路,它与编程语言无关,可以运用在任意的设计语言中,因此你经常可以看到在各种语言中都有模式的身影。接下来我们将从模式的概念出发,讲解软件模式的整体框架、设计原则和设计要素。
明戈戈
这个作者很懒,什么都没留下…
展开
-
设计模式-解释器模式
比如,你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2~3个数字,然后是一个连字号“-”,最后是7或8位数字的电话号码,比如010-12345678或020-7654321。因此,解释器模式的适用面比较窄。解释器是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言而言,用来解释预先定义的文法。以上程序只是演示了解释器模式进行文法解释的思路,在实际的开发中,则可以灵活运用,丰富它们的功能。它等效于上面的3个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。原创 2024-07-10 11:09:30 · 1349 阅读 · 0 评论 -
设计模式-中介者模式
但是生产者被唤醒后不能马上进行生产,因为它在 wait()的时候已经丧失了对仓库的控制权,所以就需要等待消费者线程结束操作,才能重新取得仓库的控制权,再进行生产。各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用 Mediator 模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性。在使用中介者模式的时候注意控制中介者角色的大小。原创 2024-07-09 11:20:50 · 1034 阅读 · 0 评论 -
设计模式-访问者模式
数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作,这样的过程叫做双重分派。节点调用访问者,将它自己传入,访问者则将某算法针对此节点执行。因此,要实现 Visitors 对 Subiect 的访问,首先应该允许 Subject接受 Visitor 的访问,然后即可实现对自身的访问。访问者模式是一种分离对象数据结构与行为的方法,通过这种分离,可以为一个已存在的类或类群(即被访问者)增加新的操作(即访问者)而无须为它们进行任何修改。原创 2024-07-09 11:02:55 · 1489 阅读 · 0 评论 -
设计模式-状态模式
比如使用 MSN、QQ等可以切换不同的状态,例如在线、隐身、忙碌、离开、空闲等,在不同的状态下你可以做不同的事情,例如在线时可以收发文件,而隐身时就不能收发文件等,当你每次设定确认你的状态后,你的状态信息就会显示给你的好友。这就不难理解什么状态模式了。状态模式在工作流或游戏等各种系统中大量使用,甚至是这些系统的核心功能设计,例如政府OA 中,一个批文的状态有多种:未办、正在办理、正在批示、正在审核、已经完成等各种状态,使用状态机可以封装这个状态的变化规则,从而达到扩充状态时,不必涉及到状态的使用者。原创 2024-07-08 10:53:38 · 1073 阅读 · 0 评论 -
设计模式-备忘录模式
当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个 Session 对象,同时分配一个 String 类型的ID号,JSP 引擎同时将这换个ID号发送到客户端,存放在Cookie 中,直到客户关闭浏览器后,服务器端才将该客户的 Session 对象取消,并且与客户的会话对应关系消失。备忘录模式是用一个备忘录对象来存储另外一个对象的内部状态,将该对象的状态捕捉住,并外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。Session 对象通过下面的方法来实现对象的缓存。原创 2024-07-08 10:21:07 · 1004 阅读 · 0 评论 -
设计模式-命令模式
命令模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”。这也是命令模式典型的应用场景。(4) 命令实现类 MyCommand.java是具体的命令实现,它供发起者 Invoker.java 调用,以向接收者 Receiver.java 发起调用请求,因此它拥有一个 Receiver.java对象,并在命令执行函数中调用接收者。命令模式是一种对象行为型模式,它主要解决的问题:在软件构建过程中,行为发起者与行为实现者之间的紧耦合的问题。原创 2024-07-04 11:11:56 · 1035 阅读 · 1 评论 -
设计模式-责任链模式
在该函数中为了实现对下家的引用,必须继承自 AbstractHandler,以实现对下家的引用,并提供getter/setter函数实现对该引用的取得和修改操作,这就是责任链的核心。由流管道的责任链模式也可以得出,凡是具有过滤和管道特征的应用都属于责任链器模式,例如 Java EE 中的 Filter 过滤器、UNIX中的管道符等,都属于责任链模式。因此,Java I/O 库中的所有输入流、输出流的类都采用了责任链模式,它们可以无限次地进行装饰转换,转换的目标就是得到自己想要的数据类型的流对象。原创 2024-07-04 10:42:00 · 1110 阅读 · 0 评论 -
设计模式-迭代子模式
Vector 里有很多对象,如果你要查看其中的所有对象,一个办法是用 Vector 的 get(int index)方法,不过这样效率比较低,另外一个方法是用 Vector 的 elements(方法返回一个 Enumeration 对象,用 Enumeration 的 hasMoreElements()方法向下移动并判断当前位置是否有对象,有则用nextElement()方法返回这个对象。Enumeration接口定义了可以对一个对象的类集中的元素进行枚举(一次获得一个)的方法。其源代码如下程序所示。原创 2024-07-03 12:25:41 · 1145 阅读 · 0 评论 -
设计模式-观察者模式
GOF 给观察者模式如下定义:定义对象间的一种一对多的依赖关系,让多个观察者对象同时关注同一个对象,当该对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。Observable.java 是一个观察者目标类,它也类似于上面提到的抽象观察者类,它提供了一个Vector 列表用来保存观察者对象,并提供了增加、删除、通知观察者的具体实现。(6) 被观察者实现类 MySubject.java是一个具体的目标类,它仅仅实现自身的操作函数,并适时调用 notifyObservers()来通知所有的观察者。原创 2024-07-03 11:07:26 · 1165 阅读 · 0 评论 -
设计模式-模板方法模式
因为 HtpServlet.service()方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service()方法,只需覆盖相应的 do 方法就可以了。模板方法模式的使用方法:定义一个abstract的Class,在这个抽象类中,至少包括一个实现模板方法的不可被子类改写的public方法(需声明为final),在这个公共方法中,实现模板方法的业务处理逻辑,同时,在这个方法中,还包括一些对本类中的抽象方法的调用:再根据业务的需要,定义各种不同的子类,并实现模板方法类的所有抽象方法。原创 2024-07-02 11:50:30 · 1196 阅读 · 2 评论 -
设计模式-策略模式
策略模式的使用是由用户发起的,根据用户的操作决定使用什么具体的策略角色。(3) 加法策略类 Plus.java用来进行加法运算,它继承了策略抽象类AtstractCalculator.java,从而能够调用 split()函数取得加法的两个数值,并实现了策略接口ICaculator.java,在 calculate()中计算两个数字的和。它们使用了策略模式,其中的 LayoutManager 是顶层的策略接口,LayoutManager2 是扩展的策略接口,具体的实现类都是策略类,如下图所示。原创 2024-07-02 11:01:31 · 1308 阅读 · 0 评论 -
设计模式-享元模式
当一个客户端对象请求一个享元对象的时候,享元工厂需要检查系统中是否已经有一个符合要求的享元对象,如果已经有了,享元工厂就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂就应当创建一个新的合适的享元对象。如果从类中移出某些数据并存储到外部,且这样能大幅度地减少程序需要保存的不同类实例的数量,就适合使用享元模式,以避免大量非常相似的类的开销。通过以上连接池的管理,实现了数据库连接的共享,不需要每一次取得连接时都重新创建,因为节省了重复创建数据库连接的开销,使得程序的性能大幅提升。原创 2024-07-01 11:01:14 · 936 阅读 · 0 评论 -
设计模式-组合模式
AWT类全部在java.awt包中,Java图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮、一个标签等。类java.awt.Component 是许多组件类的父类,Component 类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等。其源代码如下程序所示。因此,这里的容器类就是组件类的组合,所有的子容器类型都可以拥有多个Component的子类型对象,如下图所示。原创 2024-07-01 10:39:52 · 1185 阅读 · 0 评论 -
设计模式-桥接模式
这句话有3个关键词,也就是。原创 2024-06-15 11:00:42 · 1365 阅读 · 0 评论 -
设计模式-外观模式
根据外观模式的应用场景可知,在Java中,凡是为一个子系统提供统一的外部接口,而不需要了解子系统内部的类都属于外观模式的应用。外观模式可以将一些列复杂的类包装成一个简单的封闭接口。(4) 外观模式类Computerjava的源代码如下程序所示,其中包含了CPU、内存和硬盘 3个类对象,并定义了启动和关闭计算机的函数,在启动和关闭时批量地启动和关闭CPU、内存和硬盘。从程序的输出可以看出,通过 Computer 一个外观类即可实现计算机所有部件的控制,而不需要单独去控制其所有的部件,这正是外观模式的作用。原创 2024-06-15 10:35:17 · 1214 阅读 · 0 评论 -
设计模式-代理模式
在对已有的方法进行使用的时候需要对原有方法进行改进或者修改,这时候有两种改进选择:修改原有方法来适应现在的使用方式,或者使用一个“第三者”方法来调用原有的方法,并且对方法产生的结果进行一定的控制。上面的代码表面上看很复杂,但它的作用其实很简单,就是告诉 DynamicProxy 类用一个指定的类加载器来动态创建一个对象,该对象要实现指定的接口(本例为Soucable),并用提供的InvocationHandler来代替传统的方法主体。代理模式中的代理者就好比中介机构,它提供了对被代理对象的一切事物。原创 2024-06-14 11:19:23 · 1398 阅读 · 0 评论 -
设计模式-装饰器模式
然后它实现了Sourcable.java接口,以期保持与source 同样的接口,并在重写的 operation()函数中调用 source的 operation()函数,在调用前后可以实现自己的输出,这就是装饰器所扩展的功能。为了演示多次装饰的效果,我们这里分别创建了3个装饰器,第一个装饰器Decorator1 装饰Source 对象,第二个装饰器 Decorator2 装饰被第一个装饰器装饰后的对象,第三个装饰器 Decorator2装饰被第二个装饰器装饰后的对象。它与对象的适配器模式的异同点如下。原创 2024-06-14 10:54:35 · 1262 阅读 · 0 评论 -
设计模式-适配器模式
Adaptee 类只有 operation()方法,没有 newoperation()方法,但是客户端又需要目标类同时拥有这两个方法,这时便可以新建一个接口 Target,并提供一个中间环节 Adapter类,Adapter 类实现了 Targe接口,并继承自 Adaptee,Adapter 类的 operation()方法重新封装了 Adapter 类的 operation()方法,并同时实现了 newoperation()方法,这便实现了适配的目的。但是根据需求的不同,可以分别选用3种不同的子模式。原创 2024-06-13 10:37:32 · 1377 阅读 · 0 评论 -
设计模式-原型模式
因此,使用Obiect.clone()方法只能浅层次的克隆,即只能对那些成员变量是基本类型或String类型的对象进行克隆,对那些成员变量是类类型的对象进行克隆要使用到对象的序列化,不然克降出来的 Prototype 对象都共享同一个 obj 实例。用面向对象的方法来说就是,我们先建立一个原型,然后通过对原型进行复制和修饰的方法,就可以产生一个与原型相似的新对象。从以上的使用可以看出,在Java中Prototype 模式变成 clone()方法的使用,此方法执行的是该对象的“浅复制”,而不“深复制”操作。原创 2024-06-13 09:51:08 · 1231 阅读 · 0 评论 -
设计模式-建造者模式
与 StringBuilder 建造者类一样,ProcessBuilder也是建造者类,它管理的数据对象是一系列的命令,这些进程的命令存储在command列表对象中,对该列表对象的创建和管理就构成了对该复合对象进行管理的功能。工厂类提供了生产单个产品的功能,而建造者模式则可以将各种产品集中起来进行统一管理,建造者模式也是工厂模式的扩展,区别是它将各种产品集中了起来。但如果我们还应该关注该汽车的各部分是怎么造出来的(或者说,不同的工厂对产品的各部分的造法不一样),我们就应该使用 Builder 模式。原创 2024-06-12 11:17:25 · 1791 阅读 · 0 评论 -
设计模式-单例模式
为了在系统中使用该属性文件中定义的用户名和密码,可以根据以上的单例模式模板文件SingletonFactory.java创建一个工厂类,其中定义一个私有变量 properties,用来在系统启动时将文件读取数据存储在该变量中,并提供一个按照用户名查找密码的函数getConfigO。单例模式是一种特殊的工厂方法模式,它适合于一个类只有一个实例的情况,比如窗口管理器打印缓冲池和文件系统。典型的情况是,那些对象的实例能够被整个软件系统的不同对象访问,因此需要一个全局的访问指针,这便是众所周知的单例模式的应用。原创 2024-06-12 10:25:57 · 1050 阅读 · 0 评论 -
设计模式-抽象工厂模式
当然这并不表示普通的工厂方法没有适用的场合,如果产品结构比较固定也比较简单,则可以使用,就好比方法工厂章节中Swing的工厂BorderFactory 所示。前面文章中的3种工厂方法模式中,核心都是工厂类,一个工厂类承担了所有产品的创建工作,如果产品的树形结构需要扩展,就必须在工厂类中为新增的产品增加创建功能,这显然违背了开闭原则–在扩展时不能够修改原有的代码。为了解决这个问题,我们可以采用抽象工厂模式,即建立与产品类等级相似的工厂等级结构,为每一个产品都提供一个具体的工厂类,如下图所示。原创 2024-06-11 15:31:02 · 666 阅读 · 0 评论 -
设计模式-工厂方法模式
工厂方法模式的作用是负责实例化同一个接口的多个类。工厂方法模式的意义是定义一个创建产品对象的工厂类,由该工厂统一创建继承了同一个接口的多个产品对象。根据工厂类和工厂方法的不同形式,可以用来表示不同的创建策略。根据决策策略的不同,工厂方法模式可以分为3个子类型。工厂方法模式(FactoryMethod):最基本的工厂模式多个工厂方法模式:对工厂方法模式的扩展。原创 2024-06-11 14:54:24 · 863 阅读 · 0 评论 -
设计模式-六大原则
设计模式体现的是软件设计的思想,而不是软件技术,它重在使用接口与抽象类来解决各种问题。在使用这些设计模式时,应该首先遵守六大原则。原则含义具体方法开闭原则对扩展开放,对修改关闭多使用抽象类和接口里氏代换原则基类可以被子类替换使用抽象类继承,不使用具体类继承合成复用原则要依赖于抽象,不要依赖于具体针对接口编程,不针对实现编程接口隔离原则使用多个隔离的接口,比使用单个接口好建立最小的接口迪米特法则一个软件实体应当尽可能少地与其他实体发生相互作用通过中间类建立联系依赖倒转原则。原创 2024-06-08 10:58:54 · 964 阅读 · 0 评论 -
设计模式-设计模式分类
23 种设计模式,分为创建型模式、结构型模式和行为型模式。另外,近来这一清单又增加了一些类别,例如,并发型模式、线程池模式、Java EE 企业技术的多层应用程序上的模式等。原创 2024-06-08 10:35:30 · 808 阅读 · 0 评论