1 简介
装饰模式(Decorator Pattern)定义:动态地给一个对象添加一些额外的职责,就扩展功能而言,它比生成子类方式更灵活。不使用继承,而通过关联关系来调用现有类中的方法,达到复用的目的,并使得对象的行为可以灵活变化。
2 代码
(1)抽象构件(Component)
public abstract class Component {
public abstract void operation();
}
(2)具体构件(Component1、Component2)
public class Component1 extends Component{
@Override
public void operation() {
}
}
public class Component2 extends Component{
@Override
public void operation() {
}
}
(3)抽象装饰类(Decorator)
public class Decorator extends Component{
private Component component;
public Decorator(Component c) {
component=c;
}
@Override
public void operation() {
component.operation();
}
}
(4)具体装饰类(Decorator1、Decorator2)
public class Decorator1 extends Decorator{
public Decorator1(Component c) {
super(c);
}
@Override
public void operation() {
super.operation();
}
public void addedBehavior() {
System.out.println("addedBehavior");
}
}
public class Decorator2 extends Decorator{
public Decorator2(Component c) {
super(c);
}
@Override
public void operation() {
super.operation();
}
public void addedBehavior() {
System.out.println("addedBehavior");
}
}
3 案例分析
变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能在陆地上移动,还可以说话;还可以变成飞机,除了在陆地上移动还可以在天空中飞翔。
(1)抽象构件(Transform)
public interface Transform {
public abstract void move();
}
(2)具体构件(Car)
public class Car implements Transform{
public Car() {
System.out.println("变形金刚是一辆车");
}
@Override
public void move() {
System.out.println("在陆地上移动");
}
}
(3)抽象装饰类(Changer)
public class Changer implements Transform{
private Transform transform;
public Changer(Transform t) {
transform=t;
}
@Override
public void move() {
transform.move();
}
}
(4)具体装饰类(Robot、Airplane)
public class Robot extends Changer{
public Robot(Transform t) {
super(t);
System.out.println("变成机器人");
}
public void say() {
System.out.println("说话");
}
}
public class Airplane extends Changer{
public Airplane(Transform t) {
super(t);
System.out.println("变成飞机");
}
public void fly() {
System.out.println("在空中飞翔");
}
}
(5)客户端(Client)
public class Client {
public static void main(String[] args) {
Transform camaro=new Car();
camaro.move();
System.out.println("---------------------");
Robot bumblebee=new Robot(camaro);
bumblebee.move();
bumblebee.say();
System.out.println("---------------------");
Airplane plane=new Airplane(camaro);
plane.move();
plane.fly();
}
}
变形金刚是一辆车
在陆地上移动
---------------------
变成机器人
在陆地上移动
说话
---------------------
变成飞机
在陆地上移动
在空中飞翔
4 JDK中经典应用
(1)javax.swing 构件
可以通过装饰模式动态给一些构建增加新的行为或改善其外观显示。例如 JList 构件本身并不支持直接滚动,即没有滚动条。要创建滚动条的列表可以使用如下代码实现:
JList list=new JList();
JscrollPane sp=new JScrollPane(list);
(2)Java IO
InputStream 的层次结构对应装饰模式的结构:
-
抽象构建:InputStream
-
具体构件:ByteArrayInputStream、StringBufferInputStream、PipedInputStream、FileInputStream
-
抽象装饰装类:FilterInputStream
-
具体装饰类:BufferedInputStream、DataInputInputStream、LineNumberInputStream、PushbackInputStream