装饰器模式
装饰器模式介绍
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
- 不改变原有对象,扩展对象功能
- 使用不同的组合可以实现不同效果
- 符合开闭原则
- 扩展一个类的功能或给一个类添加附加职责
- Servlet
装饰器模式结构与实现
具体的装饰器角色可以相互嵌套!!一层层装饰!!
抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
/**
* 抽象构件角色
*/
interface Component {
void operation();
}
/**
* 具体构件角色
*/
class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("调用具体构件角色的方法");
}
}
/**
* 抽象装饰角色
* 将抽象构建角色组合
*/
class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
/**
* 具体装饰角色
*/
class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
// 在原方法后添加装饰方法
decorate();
}
/**
* 给原组件的方法 添加额外功能 装饰
*/
public void decorate() {
System.out.println("为具体构件角色装饰额外功能");
}
}
public class DecoratorTemplateTest {
public static void main(String[] args) {
// 装饰前
Component oldComponent = new ConcreteComponent();
oldComponent.operation();
System.out.println("--------------------");
// 装饰后
Component decoratedComponent = new ConcreteDecorator(new ConcreteComponent());
decoratedComponent.operation();
}
/*
* 调用具体构件角色的方法
* --------------------
* 调用具体构件角色的方法
* 为具体构件角色装饰额外功能
*/
}
Component: 相机 Camera
ConcreteComponent: 移动手机 MobilePhone
Decorator: 相机装饰器 CameraDecorator
ConcreteDecorator: 滤镜相机 FilterCamera| 美颜相机 BeautyCamera
/**
* 抽象构件角色:相机
*/
interface Camera {
/**
* 拍照
*/
void takePhoto();
}
/**
* 具体构件角色:手机
* 实现 相机功能
*/
class MobilePhone implements Camera {
@Override
public void takePhoto() {
System.out.println("用手机拍摄照片");
}
}
/**
* 抽象装饰角色:相机装饰器
* 组合抽象角色 相机
*/
class CameraDecorator implements Camera {
private Camera camera;
public CameraDecorator(Camera camera) {
this.camera = camera;
}
@Override
public void takePhoto() {
camera.takePhoto();
}
}
/**
* 具体装饰角色:相机装饰器子类->滤镜相机
*/
class FilterCamera extends CameraDecorator {
public FilterCamera(Camera camera) {
super(camera);
}
@Override
public void takePhoto() {
// 添加滤镜功能
addCameraFilter();
// 拍摄照片
super.takePhoto();
}
/**
* 给原相机的方法 添加额外功能 滤镜
*/
public void addCameraFilter() {
System.out.println("添加滤镜功能");
}
}
/**
* 具体装饰角色:相机装饰器子类->美颜相机
*/
class BeautyCamera extends CameraDecorator {
public BeautyCamera(Camera camera) {
super(camera);
}
@Override
public void takePhoto() {
// 添加美颜功能
addCameraBeauty();
// 拍摄照片
super.takePhoto();
}
/**
* 给原相机的方法 添加额外功能 美颜
*/
public void addCameraBeauty() {
System.out.println("添加美颜功能");
}
}
public class CameraDecoratorTest {
public static void main(String[] args) {
// 原相机
Camera oldCamera = new MobilePhone();
oldCamera.takePhoto();
System.out.println("--------------------");
// 装配滤镜功能的相机
Camera filterCamera = new FilterCamera(new MobilePhone());
filterCamera.takePhoto();
System.out.println("--------------------");
// 装配美颜功能的相机
Camera beautyCamera = new BeautyCamera(new MobilePhone());
beautyCamera.takePhoto();
System.out.println("--------------------");
// 装配滤镜和美颜功能的相机 [嵌套装饰器!!!]
Camera filterAndBeautyCamera = new FilterCamera(new BeautyCamera(new MobilePhone()));
filterAndBeautyCamera.takePhoto();
}
/*
用手机拍摄照片
--------------------
添加滤镜功能
用手机拍摄照片
--------------------
添加美颜功能
用手机拍摄照片
--------------------
添加滤镜功能
添加美颜功能
用手机拍摄照片
*/
}