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


前言

设计模式主要是针对软件设计中给定上下文中常见问题的通用的、可重用的解决方案。除了类本身,设计模式更强调多个类/对象之间的关系和交互过程—比接口/类复用的粒度更大。这里主要的设计模式可以分为创建型、结构型和行为型。


一、创建型行为模式

创建型行为模式主要是工厂方法模式。
工厂方法模式:定义一个用于创建对象的接口,但让子类来决定实例化哪个类。
工厂方法可以将特定应用的类同代码隔离开来。

下面是一个工厂方法模式的例子:TraceFcarory就是那个用来创建对象的接口,然后Factory1就是具体的实现类,用来创建一个FileTrace()的实例。

下面是一个静态工厂方法的例子:

在这里插入图片描述


二、结构型行为模式

适配器模式

适配器模式:将某个类或者接口转换为用户期待的形式。通过增加一个接口,将已存在
的子类封装起来,client面向接口编程,从而隐藏了具体子类。
适配器模式主要通过委派来实现。

下面是一个例子:可以看到用户非要用x1,y1,x2,y2的参数,但是原来的LegacyRectangle的参数并不是这样的。这里就先增加一个Shape接口,将LegacyRectangle隐藏起来了,其中Rectangle实现Shape接口并通过委派实现了LegacyRecrangle类的功能。
在这里插入图片描述

装饰器模式

装饰器模式:用不同子类实现不同的特性可以用继承来实现。但是当需要特性的大量组合时,可能就需要多重继承,这样会造成组合爆炸和大量代码重复的问题。装饰器模式主要是实现一个通用接口作为您要扩展的对象,添加功能,但将主要责任委托给底层对象。

一个装饰器结构:
在这里插入图片描述

具体的实现可以看看下面的例子:

首先声明一个Stack接口,然后实现一个用于decorator的基本类,他也使用了委托来实现Stack的基本功能。
在这里插入图片描述

接着就可以实现一个UndoStack的装饰器,基础功能通过委托实现,并增加新特性。
在这里插入图片描述
用户就可以用如下语句组合:
Stack t = new UndoStack(new ArrayStack());

也有如下实现方式:就像一层一层穿衣服一样
Stack s = new ArrayStack();
Stack t = new SecureStack(new SynchronizedStack(new UndoStack(s))


三、行为模式

策略模式

策略模式:有多种不同的算法来实现同一个任务,但需要client根据需要动态切换算法,而不是写死在代码里。这时可以为不同的实现算法构造抽象接口,利用委托,运行时动态传入client倾向的算法。

还是来看看例子:pay方法通过委托实现,用户可以根据自己的支付方式传入不同的对象,这样就能完成不同的算法。
在这里插入图片描述

模板模式

模板模式:共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现。使用继承和重写实现模板模式。这个其实比较简单。

还是看个例子:抽象类OrdeProcessTemplate中giftWrap和processOrder是共性方法,在模板中实现好,子类不需要也不能重写。而其他的抽象方法需要子类型重写。
在这里插入图片描述

迭代器模式

迭代器模式:客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型。也就是说,不管对象被放进哪里,都应该提供同样的遍历方式。实际上就是一个对迭代器的策略模式。

下面谈谈迭代器模式的实现:
Iterable接口:实现该接口的集合对象是可迭代遍历的。
terator接口:迭代器。
让自己的集合类实现 Iterable 接口,并实现自己的
独特 Iterator 迭代器 (hasNext, next, remove) ,允许客户端利用这个迭代器进行显式或隐式的迭代遍历。也是通过委托方式实现的。

visitor模式

visitor模式:将数据和作用于数据上的某种 / 些特定操作分离开来。为 ADT 预留一个将来可扩展功能的“接入点”,外部实现的功能代码可以在不改变 ADT 本身的情况下通过委托接入 ADT。

下面看个例子:实现类将处理数据的功能委托到外部传入的visitor,由外部visitor实现相应的功能。
在这里插入图片描述
在这里插入图片描述

策略模式和visitor模式的区别:
看到这,可能会有疑惑,策略模式和visitor模式太像了,都是通过委托建立两个对象的动态联系。
但是也有区别:

  • 但是Visitor强调是的外部定义某种对ADT的操作,该操作于ADT自身关系不大(只是访问ADT),故ADT内部只需要开放accept(visitor)即可,client通过它设定visitor操作并在外部调用。
  • 而Strategy则强调是对ADT内部某些要实现的功能的相应算法的灵活替换。
    这些算法是ADT功能的重要组成部分,只不过是delegate到外部strategy类
    而已。

visitor是站在外部client的角度,灵活增加对ADT的各种不同操作(哪怕ADT没实现该操作),strategy则是站在内部ADT的角度,灵活变化对其内部功能的不同配置。

总结

设计模式在面向可复用性和可维护性编程时作用突出,要注意理解好各个设计模式之间的区别,明白他们的不同用处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值