装饰者模式

装饰者模式

什么是装饰者模式?
英文为Decorator Pattern,见闻生义,就是用来装饰对象的设计模式。

如何装饰?
通过将实例对象传入装饰者对象,达到装饰的目的,增强了原对象的功能

为什么要使用装饰者模式?
为了避免通过继承方式达到增强目的,降低耦合;在不修改类结构的基础上,动态增强该对象
装饰者模式的UML图
装饰者模式_第1张图片
这里我们使用形状的例子来给大家讲解装饰者模式

  1. 将各种物体形状抽象为接口Shape,包含一个绘制方法draw(),各种具体形状类都需要实现该接口
public interface Shape {
     
   void draw();
}
  1. 创建形状装饰器的抽象类,必须实现Shape接口,且组合一个Shape对象,具体的装饰器类必须继承此抽象装饰器
public abstract class ShapeDecorator implements Shape{
     
   public Shape shape;

   public ShapeDecorator(Shape shape) {
     
      this.shape = shape;
   }

   @Override
   public void draw(){
     
      shape.draw();
   }
}
  1. 紧接着,创建Circle类和RedBorderDecorador类
public class Circle implements Shape {
     
   @Override
   public void draw() {
     
      System.out.println("我是圆形");
   }
}

public class RedBorderDecorator extends ShapeDecorator {
     
   public RedBorderDecorator(Shape shape) {
     
      super(shape);
   }

   @Override
   public void draw() {
     
//      super.draw();
      shape.draw();
      System.out.println("装饰上了红色边界");
   }
}
  1. 为Circle动态装饰上红色边界
	  Shape s = new Circle();
      //给圆形装饰上红边界
      RedBorderDecorator rb = new RedBorderDecorator(s);
      rb.draw();

在这里插入图片描述

  1. 再创建黄色背景装饰器,为圆形装饰上黄色背景
public class YellowBgDecorator extends ShapeDecorator {
     
   public YellowBgDecorator(Shape shape) {
     
      super(shape);
   }

   @Override
   public void draw() {
     
      super.draw();
      System.out.println("装饰上了黄色背景");
   }
}

在这里插入图片描述

  1. 如果是要将装饰了红色边界的圆形再添加黄色背景该怎么实现?
    只需将红边界装饰器传入黄背景装饰器的构造方法即可,这就是为什么抽象装饰器ShapeDecorator需要实现Shape接口的原因
 public static void main(String[] args) {
     
      Shape s = new Circle();
      //给圆形装饰上红边界
      RedBorderDecorator rb = new RedBorderDecorator(s);
      rb.draw();
      //给圆形装饰上黄背景
      YellowBgDecorator yb = new YellowBgDecorator(s);
      yb.draw();
      //给圆形装饰上红边界和黄背景
      yb = new YellowBgDecorator(rb);
      yb.draw();
   }

装饰者模式_第2张图片
到这里,装饰者模式就讲完了,小伙伴们,我讲清楚了吗?

奥里给!

你可能感兴趣的:(设计模式)