HeadFirst中装饰者模式的定义:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的的替代方案。
装饰模式的职责:动态的为一个对象增加新的功能。装饰模式是一种用于代替继承的技术,无需通过继承增加子类就可以扩展对象的功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
看看大神的详解(就没话说了)http://blog.csdn.net/hguisu/article/details/7531960
补充一点,装饰模式在Java领域中的应用:
1.JavaIO中流的设计
2.Swing中图形界面的构件功能
3.Servlet和Struts2中request类的设计。
来模仿一下高淇老师的Demo
package com.wxisme.decorator;
/**
* 装饰设计模式
* @author wxisme @gaoqi
*
*/
//构建角色接口Component
public interface iCar {
void move();
}
//具体的构建角色ConcreteComponent
class Car implements iCar {
@Override
public void move() {
System.out.println("行驶在马路上 ");
}
}
//Decorator装饰角色
class SuperCar implements iCar {
protected iCar car;
public SuperCar(iCar car) {
super();
this.car = car;
}
@Override
public void move() {
car.move();
}
}
//一下是具体的装饰角色ConcreteDecorator
class FlyCar extends SuperCar {
public FlyCar(iCar car) {
super(car);
}
public void fly() {
System.out.println("汽车在天上飞 ");
}
public void move() {
super.move();
fly();
}
}
class WaterCar extends SuperCar {
public WaterCar(iCar car) {
super(car);
}
public void swim() {
System.out.println("汽车在水里游 ");
}
public void move() {
super.move();
swim();
}
}
class AICar extends SuperCar {
public AICar(iCar car) {
super(car);
}
public void autoMove() {
System.out.println("汽车在无人驾驶 ");
}
public void move() {
super.move();
autoMove();
}
}
package com.wxisme.decorator;
/**
* 测试装饰模式
* @author wxisme
*
*/
public class DemoDecorator {
public static void main(String[] args) {
Car car = new Car();
car.move();
System.out.println("------------------");
//多态
SuperCar fcar = new FlyCar(car);
fcar.move();
System.out.println("------------------");
WaterCar wc = new WaterCar(car);
wc.move();
System.out.println("------------------");
WaterCar wc2 = new WaterCar(new FlyCar(new AICar(car)));
wc2.move();
}
}
运行结果:
行驶在马路上
------------------
行驶在马路上
汽车在天上飞
------------------
行驶在马路上
汽车在水里游
------------------
行驶在马路上
汽车在无人驾驶
汽车在天上飞
汽车在水里游
ps.装饰模式就这么愉快的学会了,要想用好还要不断地去实践啊。