适配器UML图如下

Target(目标接口):需要转换的接口
Adaptee(源角色):需要适配的类或接口
Adapter(适配器):将接口适配成目标接口,继承源接口,实现目标接口。
如下一个简单案例
//目标接口
public interface FlyTarget {
void canFly();
}
//需要适配的类
public class Flying {
public void fly() {
System.out.println("i can flay");
}
}
//代理实现
public class Bird extends Flying implements FlyTarget {
@Override
public void canFly() {
System.out.println("i am bird");
fly();
System.out.println("over flay,i am walk");
}
}


Component:抽象组件角色,定义一组抽象接口,规定这个被装饰组件的功能
ConcreteComponent:实现这个抽象组件的所有功能
Decorator:装饰器角色,持有一个Comonent对象实例的引用,定义一个与抽象组件一致的接口。
ConcreteDecorator:具体装饰器实践者,负责实现装饰器角色定义的功能
如下简单案例
//初始功能接口定义
public interface FlyConponent {
void flay();
}
//初始功能实现
public class FlyConcreteComponent implements FlyConponent {
@Override
public void flay() {
System.out.println("to fly");
}
}
//装饰器角色
public class FlyDecorator implements FlyConponent {
public FlyConponent flyConponent;
public FlyDecorator(FlyConponent flyConponent) {
this.flyConponent = flyConponent;
}
@Override
public void flay() {
flyConponent.flay();
}
}
//装饰器实现
public class EagleFlyComponent extends FlyDecorator {
private String tool;
public EagleFlyComponent(FlyConponent flyConponent, String tool) {
super(flyConponent);
this.tool = tool;
}
public void birdFlay() {
System.out.print(" use " + tool);
flyConponent.flay();
}
}
上面案例中,装饰器模式就是赋予被装饰类更多的功能,在Java I/O中,有很多组合功能情况,这些不同功能的组合就是装饰器实现的,比如FilterInputStream为案例说明
如下FilterInputStream的UML图

InputStream类是一个抽象类,FileInputStream是具体的组件,实现了抽象类所有接口,所以FilterInputStream是我们的装饰角色,他实现了InputStream所有接口,并且持有InputStream的一个实例
BufferInputStream是具体的装饰器实现,他给InputStream增加了功能。这个装饰器类作用就是使InputStream读取数据保存在内存中。从而提高读取的性能
与只类似的功能的还有LineNumberINputStream,作用是按行读取数据的功能,他们使InputStream类增强了功能,或者提升性能。