1、简介
装饰者模式又名包装模式(Wrapper),是一种对象结构型模式。是一种用于替代继承的技术,他通过一种无需定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系
实际就是动态地给一个对象添加一些额外的功能,比生成子类要灵活
-
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
-
缺点:多层装饰比较复杂。
-
使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。
2、应用示例
一幅画不论是否有相框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。
/**
* 包装模式
*/
public class DemoWrapper {
public static void main(String[] args) {
Shape circle = new Circle();
circle.draw();
System.out.println("-----circle-----");
ShapeDecorator circleShapeDecorator = new RedShapeDecorator(new Circle());
circleShapeDecorator.draw();
System.out.println("-----circleShapeDecorator-----");
ShapeDecorator rectangleShapeDecorator = new RedShapeDecorator(new Rectangle());
rectangleShapeDecorator.draw();
System.out.println("-----rectangleShapeDecorator-----");
}
}
interface Shape{
/**
* 画的抽象方法
*/
void draw();
}
/**
* 圆形的画
*/
class Circle implements Shape {
@Override
public void draw() {
System.out.println("圆形的画");
}
}
/**
* 长方形画
*/
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("长方形画");
}
}
/**
* 抽象装饰类
*/
abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
/**
* 具体装饰类
*/
class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
/**
* 扩展的功能
* @param decoratedShape
*/
private void setRedBorder(Shape decoratedShape){
System.out.println("边框颜色:红色");
}
}