设计模式(一)

二十三种设计模式包括工厂模式、建造者模式、工厂方法模式、原始模型模式、单例模式、适配器模式、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、责任链模式、命令模式、解释器模式、迭代子模式、调停者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。


[size=large][color=black][b]1. 建造者模式[/b][/color][/size]
建造者模式能够将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。表面看建造者模式与抽象工厂模式相似。与抽象工厂的区别是:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者相互联系,指导者联系建造者,最后得到产品即建造者模式可以强制实行一种分步骤进行的建造过程。
建造者模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,关于内部是如何建造成成品的,调用者无需关心。

一般在下列场景中使用建造者模式
1. 需要生成的产品有复杂的内部结构
2. 需要生成的产品对象的属性互相依赖
3. 在对象的创建过程中会使用到其他对象

在建造者模式构图中包含入下4个角色:
1. Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),他们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。
2. ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体建造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
3. Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
4. Director(指挥者):指挥者又被称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其建造方法construct()中调用建造者对象的部件构造与装配方法,完成建造复杂对象的任务。客户端一般只需要与指挥者进行交互,在 客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。

复杂对象定义:在建造者模式中设计到的复杂对象是指那些包含多个成员属性的对象,这些成员属性也称为部件或零件。例如汽车包括方向盘、发动机、轮胎等部件;

Director(指挥者)类的作用:一方面,它隔离了客户与创建过程,另一方面,它控制产品的创建过程,包括某个buildPartX()方法是否是被调用以及多个buildPartX()方法调用的先后次序等。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可以通过指挥者调用建造者的相关方法,返回一个完整的产品对象。


[img]http://dl2.iteye.com/upload/attachment/0126/1229/b51fd322-4f5d-3c88-ab14-97201aa3f2f7.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1231/5bd4a1e8-693b-376d-83b5-959c4039243d.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1233/048ea3e7-0d56-3976-9460-5a233fabf153.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1235/abace51f-82c3-31b1-a198-b43bbd2d3e35.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1237/75dc4efb-b810-375f-91f1-52e824cb67e1.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1239/6a8ad926-59b7-3bb3-89a0-01b09bc92bf5.png[/img]


[size=large][color=black][b]2. 适配器模式[/b][/color][/size]


适配器模式的目的,是使用一个已经存在的类,而它的接口不符合我们的需求。我们想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。我们想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。


举一个例子,新买的手机自带的耳机是2.5接口的,有一天耳机坏了或丢了,但是市面上根本就买不到2.5的耳机了,基本都是3.5接口的了,没办法,你只好买了个3.5接口的耳机,在购买耳机的时候老板送我们一个转换器来解决手机和耳机不兼容的问题。


适配器模式有如下4中角色

1. 目标抽象角色:定义客户所期待要使用的接口,上面手机当做客户端的话,手机需要使用的耳机接口是2.5的,在这里目标抽象角色就是这个2.5的接口设备.
2. 源角色:需要被适配的接口,就是上面买到的3.5接口的耳机
3. 适配器角色:用来把源接口转换成符合目标接口的设备,在这里指的是店老本送我们的那个“转换器”。
4. 客户端:就是那个给我们带来麻烦的手机

适配器模式分为两类
1. 类的适配器,采用继承实现
类的适配模式用于单一源的适配,由于它的源的单一化,代码实现不用写选择逻辑,很清晰。
2. 对象适配器,采用对象组合方式实现
对象的适配模式用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是由于源的数目可以很多,所以具体的实现条件选择分支比较多,不太清晰。
3. 默认适配器模式,其实除了类的适配器模式和对象适配器之外,还有默认适配器模式。当我们想实现一个接口,但又不想实现所有接口方法,而只想去实现一部分方法时,就是用默认的适配器模式。它的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。

类适配器


[img]http://dl2.iteye.com/upload/attachment/0126/1241/c2498328-710b-3481-8a1e-c02ac7502f46.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1243/2a17fc65-53f7-31a0-8223-1273b40e709e.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1245/6ad459eb-1f82-331c-9236-896d3091536e.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1247/fca384a0-938d-3e8c-9367-4be00dafb224.png[/img]


对象适配


[img]http://dl2.iteye.com/upload/attachment/0126/1250/a244e883-18e0-346a-abba-a05e96e09135.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1252/9951b1bc-c033-3445-8a94-e25b8a343459.png[/img]


[img]http://dl2.iteye.com/upload/attachment/0126/1254/d8dc6f1a-7e24-38bf-a6d4-c688ba9c21a2.png[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值