初识设计模式

本文介绍了设计模式的概念,探讨了面向对象设计的原则,并分析了设计模式如何应用于实际问题中。同时,文章还解释了一些常见的设计模式相关术语。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、何为设计模式

 是否有过一种感觉,在遇到一个问题的时候,往往会首先联想到曾经遇到的类似的问题?这种感觉源于我们以往的经验,我们之所以成长,是因为我们懂得总结过去。

 

在各行各业上,一个牛人和新手的明显不同就是在遇到问题的时候,牛人可以用以往的经验高效快速并且高质量的完成工作。而新手可能会显得无从下手。

 

要造一座房子,不应该从头开始研究房子的概念,首先应该参考以往的房子,有门有窗、房顶、地下室、墙壁、屋子格局等等。也就是说一些问题的解决方式存在着一种模式,这些模式被总结出来,便会作为指导来方便解决类似的问题,为相关问题提供解决方案。

 

设计模式:针对面向对象系统中重复出现的设计问题,提出一个通用的设计方案,并予以系统化的命名和动机解释。

该解决方案是解决该问题一组精心安排的通用类和对象,再经过定制和实现就可以用来解决特定的上下文中的问题。

它描述了问题、解决方案、在什么条件下使用该解决方案以及其效果。此外,一些设计模式还会给出实现要点和实例。

 

设计模式有四个基本要素:

名称:用来形象的描述设计模式的问题、解决方案、效果;

问题:描述了设计模式在何时使用;

解决方案:描述了设计的组成成分,它们之间的相互关系以及各自的职责和协助方式;

效果:描述了模式应用的效果及使用模式应权衡的问题;

 

二、面向对象设计

面向对象程序由对象组成,对象包括数据和对数据进行操作的方法。

 

对于面向对象问题来说,设计上首先考虑的就是对象的封装。通过分析问题中存在的对应现实世界中的模型,可以找到所要封装的对象。但是,一些并不明显的抽象对象并不存在于现实中,而设计中它们却便于实现问题的灵活性。

 

对象的操作方法,通常以函数形式实现,而将其抽象出来函数结构的集合就是该对象的接口。接口描述了对象所能接受的全部的请求的集合,任何匹配接口中函数结构的请求都可以发送给该对象。

 

对接口的设计,通常会导入类型的概念,类型用来标示特定接口的名字。卡车接受交通工具的接口,可以说卡车是交通工具类型;而它还可以接受车的接口,这说明一个对象可以是多种类型,而且类型是可以继承的。

 

一个对象在运行时来使用具体的接口,成为特定的类型,就是动态绑定。而支持对象同一类型、不同对象替换的特性称为多态。

 

对象的实现是由它的类来决定的,类同时也定义了对象内部的状态和操作的实现。

但是对象的类型只是与它的接口有关,类定义了对象的操作,自然也定义了对象的类型。

 

对于类的继承来说,可以通过复用父类功能而扩展应用功能的基本机制。然而用于描述所有子类共有接口的类十分重要,这种类通常有抽象类来实现。抽象类将接口的实现放在继承于它的子类中,因此它不能被直接实例成对象。

当继承被恰当使用时,所有从抽象类导出的类将共享抽象类的接口。这意味着子类仅仅添加或重定义操作实现,并没有隐藏父类的操作。这时,所有子类都可以响应抽象类中接口的请求,就是说,子类对象都可以是抽象类的类型。

于是,不将变量声明为某个特定的具体类的实例对象,而是让他遵从抽象类所有定义的接口,这样就很好的实现了动态绑定。

这样针对接口编程,而不是针对实现编程,对象的使用者不需知道对象的特定类型,只需知道对象是否具有满足使用条件的接口;也无需了解对象用什么类来实现的,只要知道定义接口的抽象类就可以。

 

三、设计模式如何作用

在以上面向对象的设计中,使用设计模式通常可以很好的指导实现对象的封装。

可以使系统很好的分解成对象的集合,包括考虑很多设计上的因素:对象粒度、依赖关系、灵活性、性能、演化、复用等。

 

以复用机制来说,复用的实现方式有三种:

继承:通过继承实现对父类的复用(白箱复用)。在编译时即可使用,但是运行时无法进行对父类的实现。而且继承揭示了父类的细节,从一定意义上来说破坏了封装性;

组合:创建对象由其它对象组合而成(黑箱复用),运行时实现动态绑定,而且保持每个类被封装;

模板:也成为参数化类型,通过实例化参数的类型实现复用;

一般来说,组合的使用优先于继承。组合可以用委托的方式来很好的实现继承:

例如有窗口类Win和一个矩形类Rec,Win对象中包含一个Rec对象,Win类可以定义Area(),用来调用Rec对象的Area()返回窗口对象区域;

这里Win包含Rec,而不是继承Rec,接受请求的对象将操作委托给它的代理者。

 

设计模式可以针对面向对象的设计问题来指导如何选择复用方式。同样对于其他影响设计的因素也进行考虑。

 

四、常见设计模式中的概念

1、框架:构成一类特定软件可复用设计的一组相互协作的类。

区别于设计模式:

设计模式比框架更抽象,框架能够用代码表示,往往还能执行;

设计模式是比框架更小的体系结构元素,一个框架可能包括了多个设计模式,反之则不会;

框架比设计模式更加特例化,例如图形编辑器框架,某类型游戏服务器框架等;

 

2、聚合对象:一种包含子对象的对象。这些子对象成为聚合对象的部分,而聚合对象对它们负责。

 

3、聚合关系:聚合对象与其部分之间的关系。类为其对象定义这种关系。

 

4、耦合:软件构件之间相互依赖的程度。

 

5、相识关系:如果一个类指向另一个类,这两个类间具有相识关系。

 

6、类图:描述类及其内部结构的操作,以及类间的静态关系。

三角线:表示继承关系,A——|>B 表示A继承B;

菱形箭头:表示聚合关系,A◇——>B 表示A对象中包含一个B对象;

实线箭头:表示相识关系,A——>B 表示A中有一个指向B的引用,B对象可能是多个A对象共享的;

虚线箭头:表示创建关系,A……>B 表示A类创建了B,也有用实线表示的;

圆点:表示多于一个,A◇——>·B 表示A对象中包含多个个B对象;

 

7、对象图:描述运行时特定的对象结构。

 

8、交互图:展示对象间请求的流程。

 

 

以上内容源于对《设计模式:可复用面向对象软件的基础》一书内容的整理,因为笔者是个穷银,没钱买书,正好借人家的来看,看完又怕记不住,就整理到这里一份笔记。

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值