找回密码
 立即注册
首页 业界区 安全 四、装饰者模式

四、装饰者模式

后仲舒 2026-2-12 00:20:00
一、模式定义

  在不改变原有对象的前提下(不改变ConcreteComponent情况下),给原有对象扩展功能(利用ConcreteDecorator扩展功能,在ConcreteDecorator中注入ConcreteComponent)。如下所示:
1.png

二、应用场景

  扩展一个类的功能,或者给一个类添加一些附加职责
三、优点:

①、灵活改变组合;
②、符合开闭原则;
四、装饰者模式的实现方式

4.1、方式1
  1. package decorator;public class DecoratorDesignPattern {   public static void main(String[] args) {      Decorator decoratorA = new ConcreteDecoratorA(new ConcreteComponent());      decoratorA.operation();      Decorator decoratorB = new ConcreteDecoratorB(new ConcreteDecoratorA(new ConcreteComponent()));      decoratorB.operation();   }}interface Component{   void operation();}class ConcreteComponent implements Component{   @Override   public void operation() {      System.out.println("拍照...\n");   }}abstract class Decorator implements Component{   Component component;   public Decorator(Component component) {      this.component = component;   }}class ConcreteDecoratorA extends Decorator{   public ConcreteDecoratorA(Component component) {      super(component);   }   @Override   public void operation() {      System.out.println("添加美颜....");      component.operation();   }}class ConcreteDecoratorB extends Decorator{   public ConcreteDecoratorB(Component component) {      super(component);   }   @Override   public void operation() {      System.out.println("添加滤镜");      component.operation();   }}
复制代码
上面代码的运行结果如下:
2.png

4.2、方式2
  1. package decorator;public class DecoratorPattern {   public static void main(String[] args) {      Circle circle = new Circle();      RedShapeDecorator redCircle = new RedShapeDecorator(circle);      Rectangle rectangle = new Rectangle();      RedShapeDecorator redRectangle = new RedShapeDecorator(rectangle);      System.out.println("Circle with normal border");      circle.draw();      System.out.println("\nCircle of red border");      redCircle.draw();      System.out.println("\nRectangle of red border");      redRectangle.draw();   }}interface Shape {   void draw();}class Circle implements Shape {   @Override   public void draw() {      System.out.println("Shape:Circle");   }}class Rectangle implements Shape {   @Override   public void draw() {      System.out.println("Shape:Rectangle");   }}abstract class ShapeDecorator implements Shape {   public Shape decoratedShape;   public ShapeDecorator(Shape decoratorShape) {      this.decoratedShape = decoratorShape;   }   @Override   public void draw() {      decoratedShape.draw();   }}class RedShapeDecorator extends ShapeDecorator {   public RedShapeDecorator(Shape decoratorShape) {      super(decoratorShape);   }   @Override   public void draw() {      decoratedShape.draw();      setRedBorder(decoratedShape);   }   private void setRedBorder(Shape decoratedShape){      System.out.println("Border Color: Red");   }}
复制代码
上面代码的运行结果如下:
3.png

五、装饰者模式的应用

  Java IO 库采用了装饰器模式(Decorator Pattern)和适配器模式(Adapter Pattern)的组合设计模式,其中InputStream是装饰器模式中顶层的抽象类,FilterInputStream是装饰器基类,BufferedInputStream是带有缓冲区的装饰器类,ObjectInputStream是可以读取对象的装饰器类,SequenceInputStream是可以顺序读取多个输入Stream的装饰器类,FileInputStream、ByteArrayInputStream则是被装饰的类。 这些类的UML图,如下所示:
4.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册