#软件构造 复用性与各种设计模式(1)结构型模式

在4.3节中提到了很多种设计模式,这里对其进行总结

首先大体上,这些设计模式分为

  • 结构型模式 :处理类或对象的组成结构,解耦多个类,引入一个抽象类用于将来的扩展;封装复杂的结构。
  • 行为类模式 :描述类/对象交互和互相分配责任的方式,允许算法和对象职责分配之间的选择(“谁做什么”);简化在运行时难以追踪的复杂的控制流。

一.结构型模式

1.适配器模式

将某个类/接口转换为客户端期望的其他形式,通过增加一个接口,作为两个互不相容的接口的适配器,将已存在的子类封装起来,适配器模式让本来接口不兼容而无法在一起工作的类相互适配
而客户端面向接口编程,从而隐藏了具体子类。
通常应用于将旧类/接口重用到新系统中(也称为“包装器”),提供访问旧组件的入口
在这里插入图片描述
实例:
LegacyRectangle类有display()方法,需要传入矩形的4个参数:顶点坐标(x,y)、宽和高(w,h)
但是客户端只想要传递参数左上顶点坐标( x 1 x_1 x1, y 1 y_1 y1)和( x 2 x_2 x2, y 2 y_2 y2),在满足客户的需求的前提下重用旧组件,可以使用适配器模式:类图如下所示
在这里插入图片描述
在Rectangle类中通过 delegation 完成适配,实际执行LegacyRectangle类的display()方法
实现代码:
在这里插入图片描述

2.装饰器模式

装饰器模式为对象增加不同侧面的特性,对每一个特性构造子类,通过委派机制增加到对象上,向一个现有的对象添加新的功能,同时又不该边其结构,实现特性的任意组合。

装饰器模式基于一个用于 decorator的基础类,完成基础和通用的功能;如果客户端需要一个具有多种特性的类,就可以通过一层一层的装饰来实现,需要一个抽象类作为所有装饰子类的通用父类,然后将具体功能职责划分,对每一个特性构造子类,通过委派机制增加到对象上。

装饰器模式同时使用继承和委托,它比静态继承更灵活,同时具有可自定义的扩展功能
在这里插入图片描述
实例
对于一个栈结构,使用装饰器模式设计如下:
在这里插入图片描述
代码:

interface Stack {
	void push(Item e);
	Item pop();
}
public class ArrayStack implements Stack {
	... //rep
	public ArrayStack() {
		...
	}
	public void push(Item e) {
		...
	}

其中ArrayStack实现最基础的 Stack功能,被委派以基础的Stack功能

public abstract class StackDecorator implements Stack {
	protected final Stack stack;
	public StackDecorator(Stack stack) {
		this.stack = stack;
	}
	public void push(Item e) {
		stack.push(e);
	}
	public Item pop() {
		return stack.pop();
	}
	...

StackDecorator 作为一个抽象类是所以装饰子类的通用父类,给出一个用于 decorator的装饰品的载体(类似毛坯房),基础功能(push和 pop)通过 delegation在ArrayStack中实现

public class UndoStack extends StackDecorator implements Stack {
	private final UndoLog log = new UndoLog();
	public UndoStack(Stack stack) {
		super(stack);
	}
	public void push(Item e) {
		log.append(UndoLog.PUSH, e);
		super.push(e);
	}
	public void undo() {
		//implement decorator behaviors on stack } ...

UndoStack 是一个实现了的具有特性的装饰器子类,其基础功能在父类中通过delegation实现,同时又增加了新特性UndoStack和undo

实际调用:

  • 如果客户端只需调用一个简单的栈,只需要
 Stack s = new ArrayStack(); 
  • 如果客户端需调用一个具有undo功能的栈,只需要
 Stack t = new UndoStack(new ArrayStack()); 
  • 如果客户端需要一个具有多种特性的栈,通过一层一层的装饰来实现
Stack t = new SecureStack( new SynchronizedStack( new UndoStack(s))

对于这个secure synchronized undo stack,首先最底层的s是一个基础的stack,而UndoStack将s作为构造方法的参数构造一个UndoStack,装饰上了Undo的特性,同理SynchronizedStack和SecureStack在基于UndoStack的基础上,装饰上了Synchronized和Secure的特性,层层装饰实现了一个具有特定功能的栈

PS:装饰器模式和继承模式的不同:

  • 装饰器模式在运行时组合功能,继承在编译时组合功能
  • 装饰器模式由多个协作对象组成,而继承生成单个清晰类型的对象
  • 装饰器模式可以混合并匹配多个修饰,而多重继承会导致组合爆炸现象

3. Facade

这个在之前的博客中已经总结过了
参考:
https://blog.csdn.net/Franklins_Fan/article/details/105667169

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值