装饰者模式(Decorator Pattern)
程序员文章站
2022-07-13 22:05:27
...
一般,实现对象增强有三种方式:
- 继承
- 装饰者模式
- 代理模式
装饰者模式:
这个模式是结构型模式,它允许向一个现有的对象添加新的功能,同时又不改变它的结构。
我 们 为 什 么 使 用 装 饰 者 模 式 呢 ? 或 者 说 什 么 场 景 需 要 用 这 个 模 式 我们为什么使用装饰者模式呢? 或者说什么场景需要用这个模式 我们为什么使用装饰者模式呢?或者说什么场景需要用这个模式
一般的,我们为了扩展一个类的功能,需要去继承实现,由于继承会引入父类的一些静态特征, 并且随着扩展功能的增多,子类会越来越膨胀。
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
在不想增加很多子类的时候可以使用装饰者模式来扩展类。
装饰者模式代码大概分为以下几个部分
Shape | 模型接口 |
---|---|
Circle | 圆形类 |
Rectangle | 矩形类 |
ShapeDecorator(抽象的) | 模型接口的装饰类(我们创建的装饰类就是这个) |
RedShapeDecorator(扩展功能) | 装饰类的实现类(真正扩展的地方) |
Shape 模型接口
/**
* @author lankeren
*
* 模型
*/
public interface Shape {
void draw();
}
Circle 圆形类
/**
* @author lankeren
* @ClassName Circle 圆形
* @Deacription:
* @create: 2020-11-14 22:18
*/
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
Rectangle 矩形类
/**
* @author lankeren
* @ClassName Rectangle 矩形
* @Deacription:
* @create: 2020-11-14 22:16
*/
public class Rectangle implements Shape{
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
ShapeDecorator 模型接口装饰类
创建了一个装饰类,用来包装原有的类
/**
* @author lankeren
* @ClassName ShapeDecorator 模型的装饰者
* @Deacription:
* @create: 2020-11-14 22:19
*/
public abstract class ShapeDecorator implements Shape{
protected Shape decoratedShape;
// 构造器
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
@Override
public void draw(){
decoratedShape.draw();
}
}
装饰类的实现类 (真正的扩展方法)
/**
* @author lankeren
* @ClassName RedShapeDecorator
* @Deacription:
* @create: 2020-11-14 22:21
*/
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
测试入口
/**
* @author lankeren
* @ClassName DecoratorPatternDemo
* @Deacription:
* @create: 2020-11-14 22:24
*/
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println(" -- ");
circle.draw();
System.out.println(" -- ");
redCircle.draw();
System.out.println(" -- ");
redRectangle.draw();
}
}
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
装饰者模式可以代替原有类的继承
对装饰者模式的理解
MusicPhone
GiveCurrentTimePhone
// 先增强听音乐的功能,再增强通知时间的功能
Phone phone = new GiveCurrentTimePhone(new MusicPhone(new IphoneX()));
想要扩展什么功能,就继承PhoneDecorate装饰器抽象类,将想要增强的对象(最简单的实现类iPhoneX或者已经被增强过的对象)传进去,完成我们的扩展!
(装饰者重写方法,继承着装饰者来扩展(添加扩展方法—重写方法))
在 Java 的 I/O 中使用到了 装饰者模式 >> 这块内容待补
部分参考: 设计模式之装饰者模式
部分参考:Java3y
上一篇: 百度外卖移动组件架构与优化