关于复用的几个设计模式

一、适配器模式
定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
结构:
①目标接口:当前系统业务所期待的接口,它可以是抽象类或接口。
②适配者类:它是被访问和适配的现存组件库中的组件接口。
③适配器类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者
举例:
在这里插入图片描述

在这里插入图片描述

目前我们实际的display方法传的参数分别是x1(左下角点),y1(左上角点),w(长),h(宽)。而我们期望的display方法传的参数分别是x1(左下角点),y1(左上角点),x2(右下角点),y2(右上角点)。故我们需要一个适配器用来使期望的方法参数传进去能匹配到实际的方法参数。
可以看到我们的Rectangle类即为我们的适配器类,通过转化使满足适配的效果。即我们将参数x1,y1,x2,y2传进去,得匹配x1,y1,w,h,故可以正常调用实际的方法。故我们的适配器类的方法参数应改为x1,y1,x2-x1(即为长),y2-y1(即为宽)。

二、装饰器模式
定义:不改变现有对象结构的情况下,动态地给该对象增加一些额外功能。
结构:
①抽象构件角色:定义一个抽象接口以规范准备接收附加责任的对象。
②具体构件角色:实现抽象构件,通过装饰角色为其添加一些职责。
③抽象装饰角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
④具体装饰角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
举例:
在这里插入图片描述

现在我们有一个需求,对于Stack类有3个实现类UndoStack、SecureStack、SynchronizedStack,对于Stack中的方法在这三个类中分别有不同的形式,即对Stack类对象增加不同侧面的特性,这时候我们就需要用到装饰器。
在这里插入图片描述

其中的StackDecorator类是抽象装饰角色,通过3个具体装饰角色对其实现不同的特性,以及新方法。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

而在创建对象时,通过层层嵌套的方式从而对于类进行特性扩展。值得注意的是,在定义t时是用Stack来定义,故能用的方法必须是Stack以及3个实现类的共同方法。否则不能用Stack来定义对象。

三、外观模式
定义:一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
结构:
①外观角色:为多个子系统对外提供一个共同的接口。
②子系统角色:实现系统的部分功能,用户可以通过外观角色访问它。
③客户角色:通过一个外观角色访问各个子系统的功能。
举例:
在这里插入图片描述

原来我有三个系统的接口,而为了方便用户进行调用,我将这三个接口合并为一个接口。
在这里插入图片描述

红色方框是没有用外观模式,黄色是用了的。可以很明显的发型,用了外观模式后的代码会更加清晰,有条理。

四、策略模式
定义:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
结构:
①抽象策略类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
②具体策略类:实现了抽象策略定义的接口,提供具体的算法实现。
③环境类:持有一个策略类的引用,最终给客户端调用。
举例:
在这里插入图片描述

即通过传入的参数不同对于方法的实现也才用不同的方法。譬如Strategy是排序类,ConcreteStrategyA是冒泡排序,ConcreteStrategyB是快排。传入的参数为数组首地址,以及0-1(0为冒泡,1位快排),这就是一个比较简单的策略模式了。

五、模板模式
定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
结构:
①抽象类:负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。
②具体子类:实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
举例:
在这里插入图片描述

举个例子,比如我现在定义一个抽象类是禽类,然后两个具体子类是鸡类和鸭类,假设鸡和鸭有两个动作,一个是吃,一个是叫,并且吃的动作一样,而叫的动作不一样。这时候我们就得将具体子类中相同的方法抽象到抽象类中并实现,而对于不同的方法则分别在子类中实现。这样极大程度地减少了代码量。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值