结构型模式在我的理解中,都与适配模式有着千丝万缕的关联,根据适配的对象不同可以吧这一类型的设计模式归为以下3类。
- 类适配器:通过类继承然后实现接口来实现适配。
- 对象适配器(比如装饰,代理,外观,桥接,组合,享元都属于这类):通过聚合对象实现接口来实现适配。
- 接口适配器:适配一个接口,通过实现类实现该接口的全部方法,聚合该实现类。
本篇介绍适配器模式、桥接模式、组合模式。
6.适配器模式【Adapter】
用于不同接口对接,将一个接口通过适配器得到另一个接口。实现原理通过适配器类实现目标接口中聚合原接口的方式用原接口方法实现目标接口方法,达到适配2个接口的目的。
【个人理解】已有2个模块,在不改变这2个模块的基础上,进行重构,需要使用适配器来协调这两个模块工作。不侵入原模块,增加适配器类进行协调。
角色:
Target:目标接口
Adaptee:受改造者抽象类
Adapter:适配器继承原抽象类,实现目标接口
通过适配器将受改造者类方法适配成目标接口方法
【要领】适配器实现接口继承类。
对象结构,实现目标接口,聚合受改造者对象
适配器聚合受改造者类实现目标接口
案例:充电器(1~220v,网上有可以自己查查)
7.桥接模式【Bridge】
【概念理解】桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化。也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
用于不影响原系统功能的前提下,扩展实现方法。实现原理通过类聚合接口,通过类继承并利用原接口方法实现扩展功能方法,可以与工厂模式一起使用。
【个人理解】适用于初始架构,需要侵入修改增加桥对象,使桥对象聚合对接抽象对象,目的是使抽象与实现分离,就是用一个中间抽象类来搭桥,就是使用一个抽象桥聚合一个抽象实现类作为对接的入口,通过指定桥中的具体抽象实现类,来完成桥的功能。
角色:
Abstraction:抽象化角色,聚合实现化角色接口,用此接口方法实现抽象化方法
Implementor:实现化角色
RefinedAbstraction:修正抽象化角色,对抽象化角色的扩展与实现
Concreteimplementor:具体实现化角色,实现化角色的具体实现
【要领】聚合接口,通过传入接口实现,用传入的实现来实现接口
案例:Jdbc,odbc驱动程序
abstract class DBMS{// Abstraction,桥
Driver driver;
public abstract void query(){}
public abstract void save(){}
}
abstract class Driver{// Implementor,被连接的
public abstract void query(){}
public abstract void save(){}
}
class Java extends DBMS{//具体的桥
public abstract void query(){
driver.query();
}
public abstract void (){
driver.save();
}
}
class Jdbc extends Driver{// Concreteimplementor,具体链接的对象
public abstract void query(){
System.out.print(“java query”);
}
public abstract void save(){
System.out.print(“java save”)
}
}
class test{
public static void main(String[] args){
DBMS java=new Java();//创建一个桥
Java.driver=new Jdbc();//确定桥上要运行的对象,可动态切换
Java.query();//执行此对象在桥上的动作
Java.save();
}
}
8.组合模式【Composite】
【个人理解】组合模式:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. 合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。
角色:
Component:组合模式抽象构件
Composite:树干节点,包含下级节点,实现组合模式抽象构件方法
Leaf:叶子节点,无子节点
实现了一个类似树结构的对象,client通过访问component对来实现获取对象、加入对象、获取下级对象、移除对象等操作。
案例:文件目录,组织机构