![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
Coding-lover
Keep hungry,Keep foolish(可通过微信联系我:unilay_yang)
展开
-
优秀程序设计的18大原则
好的编程原则跟好的系统设计原则和技术实施原则有着密切的联系。下面的这些编程原则在过去的这些年里让我成为了一名优秀的程序员,我相信,这些原则对任何一个开发人员来说,都能让他的编程能力大幅度的提高,能让他开发出可维护性更强、缺陷更少的程序。1. 不要自我重复(DRY - Don’t repeat yourself)这也许是在编程开发这最最基本的一个信条,就是要告诉你不要出现重复的代码。我们很多的编程结构转载 2015-10-02 00:59:10 · 752 阅读 · 0 评论 -
职责链模式(Chain of Responsibility)
23.1 场景问题23.1.1 申请聚餐费用 来考虑这样一个功能:申请聚餐费用的管理。 很多公司都有这样的福利,就是项目组或者是部门可以向公司申请一些聚餐费用,用于组织项目组成员或者是部门成员进行聚餐活动,以增进人员之间的情感,更有利于工作中的相互合作。 申请聚餐费用的大致流程一般是:由申请人先填写申请单,然后交给领导审转载 2014-10-01 11:14:21 · 982 阅读 · 0 评论 -
工厂方法模式(Factory Method)
1 场景问题1.1 导出数据的应用框架 考虑这样一个实际应用:实现一个导出数据的应用框架,来让客户选择数据的导出方式,并真正执行数据导出。 在一些实际的企业应用中,一个公司的系统往往分散在很多个不同的地方运行,比如各个分公司或者是门市点,公司没有建立全公司专网的实力,但是又不愿意让业务数据实时的在广域网上传递,一个是考虑数据安全的问题,一个是运行转载 2014-09-24 11:35:44 · 1694 阅读 · 0 评论 -
简单工厂
简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧。 为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习。1 场景问题 大家都知道,在Java应用开发中,要“面向接口编程”。 那么什么是接口?接口有什么作用?接口如何使用?一起来回顾一下:1.1转载 2014-09-23 16:24:22 · 581 阅读 · 0 评论 -
装饰模式(Decorator)
1 场景问题1.1 复杂的奖金计算 考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂的功能,尤其是对于业务部门的奖金计算方式,是非常复杂的,除了业务功能复杂外,另外一个麻烦之处是计算方式还经常需要变动,因为业务部门经常通过调整奖金的计算方式来激励士气。 先从业务上看看现有的奖金计算方式的复杂性:首先转载 2014-09-30 21:55:10 · 1266 阅读 · 0 评论 -
模板方法模式(Template Method)
16.1 场景问题16.1.1 登录控制 几乎所有的应用系统,都需要系统登录控制的功能,有些系统甚至有多个登录控制的功能,比如:普通用户可以登录前台,进行相应的业务操作;而工作人员可以登录后台,进行相应的系统管理或业务处理。现在有这么一个基于Web的企业级应用系统,需要实现这两种登录控制,直接使用不同的登录页面来区分它们,把基本的功能需求分别描述如下:转载 2014-09-27 23:46:14 · 1893 阅读 · 0 评论 -
策略模式(Strategy)
1 场景问题1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要报不同的价格,比如:对普通客户或者是新客户报的是全价对老客户报的价格,根据客户年限,给予一定的折扣对大客户报的价格,根据大客户的累计消费金额,给予一定的折扣还要考虑客户购买的数量和金额,比如:虽然是新用户,但是一次购买的数量非常大,或者是总金额非转载 2014-09-28 11:29:52 · 953 阅读 · 0 评论 -
中介者模式(Mediator)
10.1 场景问题10.1.1 如果没有主板大家都知道,电脑里面各个配件之间的交互,主要是通过主板来完成的(事实上主板有很多的功能,这里不去讨论)。试想一下,如果电脑里面没有主板,会怎样呢?如果电脑里面没有了主板,那么各个配件之间就必须自行相互交互,以互相传送数据,理论上说,基本上各个配件相互之间都存在交互数据的可能。如图10.1所示: 图10.1 没转载 2014-09-25 16:53:11 · 945 阅读 · 0 评论 -
解释器模式(Interpreter)
21.1 场景问题21.1.1 读取配置文件 考虑这样一个实际的应用,维护系统自定义的配置文件。几乎每个实际的应用系统都有与应用自身相关的配置文件,这个配置文件是由开发人员根据需要自定义的,系统运行时会根据配置的数据进行相应的功能处理。 系统现有的配置数据很简单,主要是JDBC所需要的数据,还有默认读取Spring的配置文件,目前系统只需转载 2014-09-30 18:47:13 · 923 阅读 · 0 评论 -
迭代器模式(Iterator)
14.1 场景问题14.1.1 工资表数据的整合 考虑这样一个实际应用:整合工资表数据。 这个项目的背景是这样的,项目的客户方收购了一家小公司,这家小公司有自己的工资系统,现在需要整合到客户方已有的工资系统上。 客户方已有的工资系统,在内部是采用的List来记录工资列表;而新收购的这家公司的工资系统,在内部是采用的数组来记录工转载 2014-09-26 23:06:06 · 1008 阅读 · 1 评论 -
桥接模式(Bridge)
来写一个大家既陌生又熟悉的设计模式,也是非常实用的一个设计模式,那就是桥接模式。 说陌生是很多朋友并不熟悉这个设计模式,说熟悉是很多人经常见到或者是下意识的用到这个设计模式,只是不知道罢了。桥接模式是非常实用的一个模式,下面就来写写它。 桥接模式(Bridge)1 场景问题1.1 发送提示消息转载 2014-10-01 15:48:11 · 1617 阅读 · 0 评论 -
访问者模式(Visitor)
25.1 场景问题25.1.1 扩展客户管理的功能 考虑这样一个应用:扩展客户管理的功能。 既然是扩展功能,那么肯定是已经存在一定的功能了,先看看已有的功能:公司的客户分成两大类,一类是企业客户,一类是个人客户,现有的功能非常简单,就是能让客户提出服务申请。目前的程序结构如图25.1所示: 图25.1 已有的客户管理程序结构示意转载 2014-10-01 23:53:04 · 773 阅读 · 0 评论 -
java 服务提供者框架
服务提供者框架是指:多个服务提供者实现一个服务,系统为客户端提供多个实现,并把他们从多个实现中解耦出来。服务提供者的改变对它们的客户端是透明的,这样提供了更好的可扩展性。例如,JDBC,JMS等就是用了服务提供者框架。他们之间的关系如下图:1.服务具体实现类和服务提供者实现类是服务提供者自己去实现。以JDBC为例,这2个模块由具体的数据库提供商来实现。2.其他三个模块是java对数据库提供商怎么实现转载 2015-06-28 16:21:05 · 686 阅读 · 0 评论 -
简单工厂、工厂、抽象工厂的区别
解释一工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放到了一个具体类上. 简单工厂是工厂方法模式的特例。 工厂方法模式和抽象工厂模式的最主要的区别在于对工厂的抽象程度上。 抽象工厂模式中一般是抽象出工厂接口,表示他就是一个工厂,而不管它是制造什么产品的工厂,他的抽象程度较高。 而工厂方法模式的抽象工厂一般是针对于产品进行抽象,表示它是一个生产某类产品转载 2015-03-06 10:16:10 · 717 阅读 · 0 评论 -
I/O 设计模式 Reactor 和 Proactor
前言 网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被 称为 C10K 问题。C10K问题最早提出于2003年,10多年间,随着互联网的迅速发展,越来越多的网络服务面临的不再是C10K问题,而是C10M问题!典型的多线程服务器的线程模型 1. 每个请求创建一个线程,使用阻塞式 I/O 操作 这是最简单的线程模型,转载 2015-03-15 18:47:00 · 1523 阅读 · 0 评论 -
设计模式名称记忆法则
模仿门观工抽桥响 (关公抽桥搞的很响)调解享备单 (调解纠纷享受一条被单奖励)迭代建原装 (迭代工厂建造真货(原装))适组策命状 (始祖出了好策略收到任命状)原创 2015-01-24 14:49:11 · 990 阅读 · 0 评论 -
java 单例模式及运用
定义:确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。代码:Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的。/** * 线程安全的单例模式 * 饿汉式单例 * @author Administrator * */ public class Si转载 2015-01-22 16:10:26 · 2206 阅读 · 0 评论 -
理解多线程设计模式
多线程设计模式:1.Single Threaded Execution Pattern [同一时刻只允许一个线程操作] 比喻:三个挑水的和尚,只能同一时间一个人过桥,不然都掉河里喂鱼了。 总结:在多个线程同时要访问的方法上加上synchronized关键字。2.Immutable Pattern [变量赋值一次后只能读取,不能转载 2014-12-31 00:37:21 · 579 阅读 · 0 评论 -
设计模式六大原则详解
目录:设计模式六大原则(1):单一职责原则设计模式六大原则(2):里氏替换原则设计模式六大原则(3):依赖倒置原则设计模式六大原则(4):接口隔离原则设计模式六大原则(5):迪米特法则设计模式六大原则(6):开闭原则设计模式六大原则(1):单一职责原则定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 问题转载 2015-01-17 13:31:08 · 858 阅读 · 0 评论 -
uml 类图中的6种关系
继承:空心三角形箭头的实线,子类指向父类。代码中通常有extends关键字(Java)。实现:空心三角形箭头的虚线,实现类指向接口。代码中通常有implements关键字(Java)。关联:通常是类A中需要引用另一个类B的实例作为成员变量,表示类A需要“知道”类B。实线箭头,类A指向类B。依赖:通常是类A中的方法需要类B的实例作为其参数或转载 2014-11-29 00:14:48 · 935 阅读 · 0 评论 -
单例模式总结
一、意图保证一个类仅有一个实例,并提供一个访问它的全局访问点。我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?如果将对象赋值给一个java静态变量,那么你必须在程序一开始就创建好对象。万一这个对象非常耗费资源,而程序在这次的执行过程中又一直没有使用到它,不就形成浪费吗?一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建转载 2014-11-30 22:11:57 · 697 阅读 · 0 评论 -
原型模式(Prototype)
9.1 场景问题9.1.1 订单处理系统考虑这样一个实际应用:订单处理系统。 现在有一个订单处理的系统,里面有个保存订单的业务功能,在这个业务功能里面,客户有这么一个需求:每当订单的预定产品数量超过1000的时候,就需要把订单拆成两份订单来保存,如果拆成两份订单后,还是超过1000,那就继续拆分,直到每份订单的预定产品数量不超过1000。至于为什么要拆分,原因转载 2014-09-25 14:15:39 · 902 阅读 · 0 评论 -
生成器模式(Builder)
8.1 场景问题8.1.1 继续导出数据的应用框架 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架。 对于导出数据的应用框架,通常在导出数据上,会有一些约定的方式,比如导出成:文本格式、数据库备份形式、Excel格式、Xml格式等等。 在工厂方法模式章节里面,讨论并使用工厂方法模式来解决了如何选择具体导出方式的问题,并没有涉转载 2014-09-24 22:23:38 · 1041 阅读 · 0 评论 -
命令模式(Command)
命令模式也是开发中常见的一个模式,也不是太难,比较简单,下面来详细的写一下命令模式。 命令模式(Command)1 场景问题1.1 如何开机 估计有些朋友看到这个标题会非常奇怪,电脑装配好了,如何开机?不就是按下启动按钮就可以了吗?难道还有什么玄机不成。 对于使用电脑的客户——就是我们来说,开机确实很简单,按下转载 2014-09-26 19:36:09 · 2795 阅读 · 0 评论 -
适配器模式(Adapter)
4.1 场景问题4.1.1 装配电脑的例子1:旧的硬盘和电源 小李有一台老的台式电脑,硬盘实在是太小了,仅仅40GB,但是除了这个问题外,整机性能还不错,废弃不用太可惜了,于是决定去加装一块新的硬盘。 在装机公司为小李的电脑加装新硬盘的时候,小李也在边上观看,顺便了解点硬件知识。很快的,装机人员把两块硬盘都安装好了,细心的小李发现,这两块硬盘转载 2014-09-23 21:16:46 · 732 阅读 · 0 评论 -
面向对象的三个基本特征(讲解)
面向对象的三个基本特征是:封装、继承、多态。封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下转载 2014-09-22 17:59:51 · 600 阅读 · 0 评论 -
java 面向对象16种设计原则
Java 面向对象16种设计原则 一 类的设计原则 1 依赖倒置原则-Dependency Inversion Principle (DIP) 2 里氏替换原则-Liskov Substitution Principle (LSP)3 接口分隔原则-Interface Segregation Principle (ISP) 4 单一职责原则-Sin转载 2014-09-22 15:14:08 · 1014 阅读 · 0 评论 -
面向对象设计六大原则
面向对象设计的原则是面向对象思想的提炼,它比面向对象思想的核心要素更具可操作性,但与设计模式相比,却又更加的抽象,是设计精神要义的抽象概括。形象地将,面向对象思想像法理的精神,设计原则则相对于基本宪法,而设计模式就好比各式各样的具体法律条文了。面向对象设计原则有 6个:开放封闭原则,单一职责原则,依赖倒置原则,Liskov替换原则,迪米特法则和接口隔离原则或转载 2014-09-22 11:13:25 · 2511 阅读 · 0 评论 -
面向对象设计原则
通过这两幅图片你就可以认识到他们的重要性了吧,因为他们是这个行业的顶级专家,他们的思想是这么高,我们不应该好好的学习一下巨人的思想吗?答案是肯定的。个人理解观点:软件的复用(Reuse)或重用拥有众多优点,如可以提高软件的开发效率,提高软件质量,节约开发成本,恰当的复用还可以改善系统的可维护性。面向对象设计复用的目标在于实现支持可维护性的复用。转载 2014-09-21 23:30:35 · 770 阅读 · 0 评论 -
Java程序员应该了解的10个面向对象设计原则
摘要:Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计。查看Apache和Sun的开放源代码能帮助你发现其他Java设计原则在这些代码中的实际运用。面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton、Decorator、Observer这转载 2012-11-13 22:28:32 · 676 阅读 · 0 评论 -
设计模式功能概要
通常,一个设计模式描述了一个被证实可行的方案。这些方案非常普遍,是具有完整定义的最常用的模式。一般模式有4个基本要素:模式名称(pattern name)、问题(problem)、解决方案(solution)、效果(consequences)。 常见的Java设计模式有以下23种: 1、抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口转载 2014-09-21 20:12:54 · 558 阅读 · 0 评论 -
23个经典JDK设计模式
酷壳版主陈皓近日发表博文《JDK里的设计模式》,文中他列出了JDK中有关23个经典设计模式的示例。现把全文转载于此,全文如下:下面是JDK中有关23个经典设计模式的示例:Structural(结构模式)Adapter:把一个接口或是类变成另外一种。● java.util.Arrays#asList()● javax.swing.JTable(Tabl转载 2014-09-21 20:36:36 · 576 阅读 · 0 评论 -
JDK中设计模式
本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图。首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助。一、设计模式是什么(1)反复出现问题的解决方案(2)增强软件的灵活性(3)适应软件不断变化二、学习JDK中设计模式的好处(1)借鉴优秀代码的设计,有助于提高代码设计能力(2)JDK的设计中体现了大多数设计模式,转载 2014-09-21 20:35:17 · 565 阅读 · 0 评论 -
外观模式(Facade)
3.1 场景问题3.1.1 生活中的示例 外观模式在现实生活中的示例很多,比如:组装电脑,通常会有两种方案。一个方案是去电子市场把自己需要的配件都买回来,然后自己组装,绝对DIY(Do It Yourself)。这个方案好是好,但是需要对各种配件都要比较熟悉,这样才能选择最合适的配件,而且还要考虑配件之间的兼容性。如图3.1所示: 图3.1转载 2014-09-23 17:51:32 · 649 阅读 · 0 评论 -
抽象工厂模式(Abstract Factory)
7.1 场景问题7.1.1 选择组装电脑的配件举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如:CPU、硬盘、内存、主板、电源、机箱等等。为了使讨论简单点,只考虑选择CPU和主板的问题。事实上,我们在选择CPU的时候,面临一系列的问题,比如:品牌、型号、针脚数目、主频等问题,只有把这些都确定下来,才能确定具体的CPU。同样,转载 2014-09-24 19:38:29 · 877 阅读 · 0 评论 -
单例模式(Singleton)
1 场景问题1.1 读取配置文件的内容 考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相关的配置文件,这些配置文件多是由项目开发人员自定义的,在里面定义一些应用需要的参数数据。当然在实际的项目中,这种配置文件多采用xml格式的。也有采用properties格式的,毕竟使用Java来读取properties格式的配置文件比较简单转载 2014-09-23 23:03:16 · 865 阅读 · 0 评论 -
享元模式(Flyweight)
20.1 场景问题20.1.1 加入权限控制 考虑这样一个问题,给系统加入权限控制,这基本上是所有的应用系统都有的功能了。 对于应用系统而言,一般先要登录系统,才可以使用系统的功能,登录过后,用户的每次操作都需要经过权限系统的控制,确保该用户有操作该功能的权限,同时还要控制该用户对数据的访问权限、修改权限等等。总之一句话,一个安全的系统,需要对用转载 2014-09-29 18:55:37 · 915 阅读 · 0 评论 -
备忘录模式(Memento)
19.1 场景问题19.1.1 开发仿真系统 考虑这样一个仿真应用,功能是:模拟运行针对某个具体问题的多个解决方案,记录运行过程的各种数据,在模拟运行完成过后,好对这多个解决方案进行比较和评价,从而选定最优的解决方案。这种仿真系统,在很多领域都有应用,比如:工作流系统,对同一问题制定多个流程,然后通过仿真运行,最后来确定最优的流程做为解决方案;在工业设计和制造转载 2014-09-28 22:56:44 · 727 阅读 · 0 评论 -
状态模式(State)
18.1 场景问题18.1.1 实现在线投票考虑一个在线投票的应用,要实现控制同一个用户只能投一票,如果一个用户反复投票,而且投票次数超过5次,则判定为恶意刷票,要取消该用户投票的资格,当然同时也要取消他所投的票。如果一个用户的投票次数超过8次,将进入黑名单,禁止再登录和使用系统。该怎么实现这样的功能呢?18.1.2 不用模式的解决方案 分转载 2014-09-28 18:16:44 · 1848 阅读 · 0 评论 -
设计模式学习笔记
1.设计模式中类与类之间的6种关系在面向对象的设计模式中,类与类之间主要有6种关系:依赖、关联、聚合、组合、继承、实现。依赖:类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用。则称类A依赖类B。关联:类A当中使用了类B,其中类B是作为类A的成员变量。则称类A关联类B。聚合:聚合关系是关联关系的一种,耦合度强于关联,他们的代码表现是转载 2014-10-06 18:44:12 · 567 阅读 · 0 评论