软件构造之面向可复用性和可维护性的设计模式

对应课程第11课,面向可复用性和可维护性的设计模式

这节课主要介绍了三种类型的设计模式

1.Creational patterns 创建型模式:焦距于对象创建的过程。

2.Structural patterns 结构型模式:侧重处理类与对象之间的构成关系。

3.Behavioral patterns 行为类模式:描述了对类与对象的交互方式。



一.创造型模式

工厂方法模式 factory method pattern

适用时机:当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。

思路:定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。

优点:

①对于client而言,不需要把特定于应用程序的类写到代码,只需要处理接口相关的。也就是,只需要关注接口,只需要知道对应类的名字就可以。

②扩展性很高,添加一个类只需要扩展工厂类。

缺点:

①对client而言,必须要对creator进行子类化。不然用不到真正的产品类。

②每次增加商品,都要增加一个具体类和对象实现的工厂内容,增加了复杂性,系统依赖性。


工厂方法模式

简单说,可以分几步,

1.写个creator的interface。

2.写若干个implement了creator的实体类。

3.写个工厂factory类,这个工厂类的方法需要有一个传递了string的参数,并且能够返回一个产品类实例,这个string里面写具体的类名。然后该方法多个if来选择不同的产品类进行输出。

4.这样用户就可以用了。

二.结构型模式 重点

适配器模式 Adapter Pattern

适用时机:如果client想要把现有的接口修改成自己想要的那样。通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。

优点:可以把没有关联的类放在一起用,增加复用性。

缺点:非常容易混乱。


适配器模式

分以下几个步骤,

1.原先是有具体类的,比如LegacyRectangle。

2.然后创建一个interface接口shape适配器,然后对这个接口声明一个真正的适配器类,这个适配器类要写一个方法,它能够满足用户需求去指向任何一个子类,比如LegacyRectangle。

3.然后客户就可以用了。

装饰器模式 Decorator

适用时机:如果有很多个特性需要组合实现到不同的类上,这样组合实现太麻烦太多了。

思路:利用委托,构造装饰器,每次都可以给前一个类增加新特性。

优点:特性之间组合方便,不会相互耦合。替代继承,容易动态扩展。

缺点:容易编写复杂。


装饰器模式

步骤如下,

1.先写一个总的接口stack

2.对这个接口实现,可以写若干个实体类,比如ArrayStack

3.然后写抽象装饰类,需要abstract,然后在里面直接声明一个protected的接口field,在这里就是stack,并且还要implements这个接口,这里就是stack。写一个构造函数,构造函数的参数直接就是直接对应到这个filed。补充完接口方法。

4.完了就要写实体的装饰类,这个装饰类需要extend刚才的抽象装饰类,并且要implements步骤1的接口,在这个装饰类里面增加新特性,或者override对应的方法。

5.就可以用了,效果像穿衣服一样。

三.行为类模式 Behavioral patterns

策略模式 Strategy

适用时机:有多种不同的算法来实现同一个任务,但需要client根据需要动态切换算法,而不是写死在代码里

思路:为不同的实现算法构造抽象接口,利用delegation,运行时动态传入client倾向的算法类实例


策略模式

编写步骤如下,

1.先写一个接口,strategy

2.创建若干个接口的实体类,用implements的来对应这个接口。每个实体的方法内容相同,代表不同的策略。

3.创建context类,这个类中用了一个private的strategy属性,直接传递一个strategy作为参数进去,并且调用对应的一个方法。

4.在使用context的时候,要把2中具体的类作为参数传递进去,这样他就能自动调用对应的东西了。

模板模式 Template Method

适用时机:有多个步骤,做事情的步骤一样,但具体方法不同

思路:为不同的实现算法构造抽象接口,利用delegation,运行时动态传入client倾向的算法类实例


模板模式

1.首先一定要创建一个抽象的模板方法类,要用abstract。在里面有若干个使用的抽象方法,比如abstract void step1(),abstract void step2(),abstract void step3(),然后还要写一个模板方法,一定要final,比如public final go(),在这个方法里面需要依次调用刚刚的这些step

2.然后创建并且扩展上述类,写若干实体类。每个抽象子方法部分都要override

3.之后就可以使用了。

迭代器模式 Iterator Pattern

适用时机:客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型

– 也就是说,不管对象被放进哪里,都应该提供同样的遍历方式

思路:写迭代器就可以


迭代器模式

1.先写迭代器接口,一般里面有public返回Boolean的hasnext还有返回object的next,还有些容器接口,能返回一个迭代器的getiterator

2.在具体的方法实现以上两个接口就可以了。

迭代器模式 Iterator Pattern

访问者模式 Visitor Pattern

适用时机:想把数据结构和数据操作分离的时候

思路:对特定类型的object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类


访问者模式

1.先写一个表示元素的抽象类。这个抽象类需要有public的accept方法。

2.然后对这个抽象类写若干个实体类,用implements。并且这之中要写一个总体的类,也就是总体的数据结构。

3.写一个访问者接口,需要有多个visit方法,每个visit方法传入的参数不一样,对应步骤2中的实体类。

4.对3写一个实体类,override好以上所有的visit。

5.最后就可以使用了,.accept后面加new +visitor即可,客户写的时候主要是写visitor

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容