文章目录
一、基本概念
装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。
装饰模式(Decorator)定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。
模式角色
-
Component(抽象构件类):定义了对象的接口,可以给这些对象动态增加职责(方法),是具体构建和抽象装饰类的共同父类,声明了具体构件中需要实现的方法。
-
ConcreteComponent(具体构件类):定义了具体的构建对象,实现了在抽象构建中声明的方法,装饰器可以给他增加额外的方法。
-
Decorator(抽象装饰类):是抽象构建类的子类,用于具体构件增加职责。
-
ConcreteDecorator(具体装饰类):是抽象装饰类的子类,负责增添加新的职责。
二、简单实例
实例一、变形金刚
类图
代码实现
- 抽象构件类Transform(变形金刚)
package com.transform;
public interface Transform {
public void move(); //移动方法
}
接口中定义move()方法,具体构件类必须实现此方法。
- 具体构件类Car(汽车类)
package com.transform;
/**
* @Description:具体构件类
* 注意这里的Car设置为final类型
* 意味着不能通过继承拓展其功能,但是可以通过关联关系来拓展功能
*/
public final class Car implements Transform {
public Car() {
System.out.println("变形金刚是一辆车!");
}
@Override
public void move() {
System.out.println("在陆地上移动");
}
}
- 抽象装饰类Changer(变化类)
package com.transform;
/**
* @Description:具体装饰类Changer
* 具体装饰类是装饰模式的核心
* 实现了move方法,保证原有方法不会丢失,又可以添加新的功能
*/
public class Changer implements Transform{
private Transform transform;
//构造方法注入
public Changer(Transform transform) {
this.transform = transform;
}
@Override
public void move() {
transform.move();
}
}
- 具体装饰类Robot(机器人类)
package com.transform;
/**
* @Description:具体装饰类
*/
public class Robot extends Changer {
//用构造方法继承了父类定义的方法,还可以增加新的职能
public Robot(Transform transform) {
super(transform);
System.out.println("变成机器人");
}
public void say(){
System.out.println("你tm说话啊!");
}
}
- 具体装饰类Airplane(飞机类)
package com.transform;
/**
* @Description:具体装饰类
*/
public class Robot extends Changer {
//用构造方法继承了父类定义的方法,还可以增加新的职能
public Robot(Transform transform) {
super(transform);
System.out.println("变成机器人");
}
public void say(){
System.out.println("你tm说话啊!");
}
}
- 客户端Client
package com.transform;
/**
* @Description:
*/
public class Client {
public static void main(String[] args) {
//创建carmaro对象
Transform camaro;
camaro = new Car