设计模式浅谈

模式最早起源于建筑业而非软件业,经大量研究发现人们对舒适住宅和周边环境存在一些共同的认同规律,通过这些规律,可以归纳出设计模式来解决建筑时出现的一般性问题。不同的模式描述了在我们环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次的重用那些已有的解决方案,无须再重复相同的工作。对于软件行业的设计模式大体也是这个意思。通过对代码分类编目,总结代码设计经验,来设计解决一些特定问题的方案,实现代码复用的目的。设计模式一般包含四个基本要素:模式名称、问题、解决方案和效果。根据其设计目的一般可分为创建型、结构型和行为型。下面就对软件的23种模式简单描述我自己的理解。

创建型模式:即对类的实例化过程进行了抽象,能够达到软件模块与对象的创建和组织无关。

1.简单工厂模式:通过参数的不同返回不同类的实例,具体来说就是一个抽象接口类,定义了具体类中的方法,具体类继承分类并实现其方法,再建立一个工厂类,创建静态工厂方法并设置不同的参数实例化不同的具体类,在进行父类中方法的调用。

2.工厂方法模式:分别创建抽象工厂类和抽象产品类,抽象产品类定义产品的接口,具体产品实现抽象产品接口,抽象工厂类声明工厂方法用于返回一个产品,具体工厂实现工厂方法,并可由客户调用。

3.抽象工厂模式:分别创建抽象工厂类和抽象产品类,抽象工厂类中声明创建抽象产品的方法,具体工厂中创建具体产品;抽象产品类为每一种产品声明接口,具体产品类则定义具体产品类型,实现接口。

4.建造者模式:将部件和其组装过程分开,一步一步创建一个复杂的对象,用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造。抽象建造者类定义产品各个部件的接口,并且返回复杂对象;具体建造者类实现各个部件的构造方法;产品角色,被构建的复杂对象,包含多个部件;指挥者,负责安排复杂对象的建造次序。

5.原型模式:复制原型创建新的对象。抽象原型类,定义具有克隆自己的方法接口;具体原型类,实现具体的克隆方法,并返回自己的一个克隆对象。

6.单例模式:确保一个类只有一个实例,自行实例化并向整个系统提供这个实例。在类中定义一个静态私有变量,并在静态共有方法中对其进行实例化。同时还要拥有一个私有构造函数,确保外界不能通过new实例化它。

结构型模式:描述如何将类或者对象结合在一起形成更大的结构。

7.适配器模式:将一个接口转换为客户希望的一个接口。目标抽象类定义客户想用的特定领域接口;适配器,作为一个转换器,实现特定领域接口的方法,并在方法中调用适配者类;适配者类,即被适配的角色,定义用户使用的业务。

8.桥接模式:抽象部分与实现部分分离,使其可独立变化。抽象类定义抽象类的接口,一般为抽象类,同时设置一个业务接口的保护成员变量;扩充抽象类,实现抽象类中的定义的方法;实现类接口,定义自己的业务;具体实现类,实现接口中的方法。

9.组合模式:对单个对象(叶子)和组合对象(容器)的使用具有一致性。抽象构件,抽象类或接口,声明叶子构件和容器构件的接口,并定义管理子构件的方法;叶子构件,实现抽象构件中的行为,没有子节点;容器构件,实现抽象构件中的行为,可递归调用其子节点的业务。

10.装饰模式:动态地给一个对象增加一些额外的职责。抽象构件类,定义了对象的接口,可以给对象动态增加职责;具体构件,实现声明的方法,并可以增加额外的职责;抽象装饰类,抽象构建类的子类,可给具体构件增加职责,但在其子类中实现;具体装饰类,可调用抽象装饰类中的方法也可增加新的方法。

11.外观模式:外部与子系统的通信通过一个统一的外观对象进行。外观角色,将客户端发来的请求委派到相应的子系统中去进行处理;子系统角色,实现子系统的功能,定义子系统行为。

12享元模式:运用共享技术有效地支持大量细粒度对象的复用。抽象享元类,定义具体享元类公共的方法;具体享元类,为内部状态提供了存储空间,实现其具体方法;非共享具体享元类,不能被共享的子类;享元工厂类,创建并管理享元对象。

13.代理模式:给某一对象提供一个代理,并由代理对象控制对原对象的引用。抽象主题角色,真是主题和代理主题的共同接口,声明真实主题的业务方法。代理主题角色,控制对真实主题及其业务的使用,真实主题角色,实现抽象主题角色中定义的方法。

行为型模式:对在不同的对象之间划分责任和算法的抽象化。

14.职责链模式:避免请求发送者和接受者耦合在一起,多个对象都可能接受请求,将对象连成一条链,请求沿链传递,知道有对象处理它。抽象处理者,定义了抽象请求处理方法以及处理者的下家;具体处理者,实现请求处理方法,并判断是否可进行处理,不行,则传递请求到下家。

15.命令模式:将请求封装成一个对象,可用不同的请求对客户进行参数化。抽象命令类,声明用于执行请求的方法;具体命令类,实现抽象类中的方法,并绑定接受者的动作;调用者,即请求发送者,通过命令对象来执行请求;接受者,实现对请求的业务处理。

16.解释器模式:定义语言的文法,建立一个解释器来解释语言中的句子。

 17.迭代器模式:提供一种方法来访问聚合对象,而不暴露这个对象的内部表示。抽象迭代器,定义了访问和遍历元素的接口;具体迭代器,完成对聚合对象的遍历;抽象聚合类,存储对象,定义迭代器对象的接口,声明一个创建迭代器对象的方法;具体聚合类,实现创建迭代器的接口。

18.中介者模式:用一个中介对象来封装一系列的对像交互。抽象中介者,定义接口用于与同事对象之间通信;具体中介者通过协调各个同事对象来实现写作行为;抽象同事类,定义各同事的公有方法;具体同事类,每一个同事都引用一个中介者对象,先与中介者通信,通过中介者与其他同事通信。

19.备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

20.观察者模式:一个对象状态发生改变,其相关依赖的对象皆被自动更新。目标类,被观察对象,定义观察者集合,通知方法以及观察者增删;具体目标,实现了目标类中定义的抽象业务逻辑;观察者,声明更新方法;具体观察者,实现状态改变的具体方法。

21.状态模式:允许一个对象在其内部状态改变时改变他的行为,对象看起来似乎修改了它的类。

22.策略模式:定义一系列算法,将每个算法封装起来,并让他们可以相互替换。

23.模板方法模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以改变一个算法的结构即可重定义该算法的某些特定步骤。

时间: 2024-10-28 14:43:19

设计模式浅谈的相关文章

设计模式浅谈之----设计模式简介

1.何为设计模式 设计模式是一个通过定义.使用和测试去解决特定问题的方法,并且由于设计模式是在面向对象之后为人所知的,基本思想与面向对象不可分割. 在软件工程中,设计模式是一般只在给定条件下会重复性发生问题而提出的一种通用的解决方案. 2.设计模式简史 设计模式的概念在计算机科学领域的普及主要归功于1994年<设计模式:可复用面向对象的软件的基础>,作者GoF(即Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides 四人) 3.设计模式

ThreadLocal 设计模式浅谈

部分代码:ThreadLocal中 的get方法, 获得的是当前线程相关的对象 /** * Returns the value in the current thread's copy of this * thread-local variable. If the variable has no value for the * current thread, it is first initialized to the value returned * by an invocation of t

PHP设计模式浅谈

1.单例模式 顾名思义,单例模式定义了一个对象只能有一个实例,相当于把类的控制权给到了一个单点上. 要求: a.private的构造函数,使类无法被随意new实例化: private function __construct{ ...... } b.有一个静态变量,用来保存类的实例: static public $instance; c.有一个公共的静态方法,来访问这个实例,通常命名为getInstance: static public function getInstance(){ if(em

浅谈iOS面试所遇问题

今天面试的公司之前在百科搜索了解了一些信息,一家专业拉手媒体运营商,付费通方便了用户出行,很喜欢公司的氛围. 言归正传,面对面试官的时候还是多少会有点小紧张,有几个问题回答的也是很笼统,现在做出总结.如下: 自我面试轻轻飘过~ 这个是常识 个人信息稍作了解,常识+1 浅谈MVC框架设计模式 浅谈单例设计模式 KVC/KVO Switch开关点击出错(on状态点击依旧on状态,解决方法) cell单元格重用出现的错误(解决方法) 怎样实现代理传值 怎样实现ImageView的点击事件处理 HTTP

浅谈设计模式的学习(下)

时间过得真快啊,不知不觉又要周末了,借这个周末时间.把<浅谈设计模式的学习(下)>补上吧. 在<浅谈设计模式的学习(中)>中,说到了保持抽象的思维.接下来说一下第四点,做一个分享,也记录一下自己的学习历程. 4.学习设计模式,就不要把它看的太认真    设计模式是一个编程思想,它不是具体的代码套路.举个例子说明一下: 由于家传,接触到了一些中国的传统武术.当我与那些不懂传统武术的人交流的时候,他们总是认为中国的传统武术都是些套路.花架子,只是用来好看.在他们认为,两人打架,别人出拳

浅谈设计模式的学习(中)

在<浅谈设计模式的学习(上)>中我说到了设计模式的基石-----抽象思维.为什么需要抽象思维呢?因为越抽象就越不容易出错,就像有些领导人说话:坚持改革开放.但怎么算坚持改革开放呢,没有具体的标准,因事而异,所以就不容易违背这个坚持改革开放的原则了. 3.学习设计模式,要保持抽象的思维     什么是抽象思维呢?真的不好说,抽象的东西往往难以说明白,听了也难以搞明白,还是通过具体的例子来说吧 有这么一个学生请假的场景,如果请假时间一天以内则有班长批准就可以了,三天以内则需要老师批准,超过三天就得

浅谈php设计模式(1)---工厂模式

一.接口继承直接调用 先看看这样一段代码: 1 <?php 2 3 interface db{ 4 function conn(); 5 } 6 7 class dbmysql implements db { 8 public function conn(){ 9 echo "连接到了mysql"; 10 } 11 } 12 13 class dbsqlite implements db{ 14 public function conn(){ 15 echo "连接到了

浅谈设计模式1-策略模式

对于大多数面向对象的初学者来说,将思维模式从面向过程转变过来是一个比较困难的过程.很多人在用面向对象语言编写程序的时候,依然会感觉自己在用面向过程的思维,笔者分享这篇文章的用意便是希望可以对大家有一些积极的影响. 阅读本文可以是没有接触设计模式,但需要一定的面向对象基础,至少简单理解封装,继承多态. 对于刚开始接触设计模式来说,一开始就说概念性的东西,很少能够理解.所以我们可以先跳过这些,通过一个小的程序场景来进行一个比较直观的认识. 模拟魂斗罗发射子&弹 相信大家小的时候玩过一款叫魂斗罗的游戏

浅谈设计模式的学习(上)

作为一个开发人员,能写出一个漂亮可扩展的代码,绝对是一件令人愉快的事情.那设计模式就是一门必修课! 本文就自己学习设计模式的一点经历做一个记录. 本人在读大学时,为了学习设计模式就买了一本<java与模式>的数据,书籍有一千多页很重.而且价格不菲.没办法,花那么多钱买的不看岂不浪费.于是每天早上读一章,坚持几个月我终于读完了.这几个月真是煎熬啊,几个月下来,回忆一下似乎自己真得也没收获到什么,很悍然啊.难道是书籍不好吗还是我读的不认真?其实在我现在看来都不是.而为什么读完了却什么也没收获到呢?