设计模式 -- 装饰器模式(Decorator Pattern)

装饰器模式:属于结构型模式,作为现有的类的一个包装,向一个现有的对象添加新的功能,同时又不改变其结构。

介绍
  • 意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活
  • 主要解决问题:在不想增加很多子类的情况下扩展类
  • 优点:装饰类和被装饰类可以独立发展,不会相互耦合
  • 缺点:多层装饰比较复杂
示例

为矩形、圆形装 饰边框为例

java 复制代码
//创建一个接口
public interface Shape {
    void draw();
}

//实现接口的实体类。

public class Rectangle implements Shape {

    @Override
    public void draw() {
        System.out.println("Shape: Rectangle");
    }
}

public class Circle implements Shape {

    @Override
    public void draw() {
        System.out.println("Shape: Circle");
    }
}


//实现Shape接口的抽象装饰类

public abstract class ShapeDecorator implements Shape {

    protected Shape decoratedShape;

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

    public void draw(){
        decoratedShape.draw();
    }
}

//扩展ShapeDecorator类的实体装饰类

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");
    }
}

//使用
public static void main(String[] args) {
    Shape circle = new Circle();
    Shape redCircle = new RedShapeDecorator(new Circle());
    Shape redRectangle = new RedShapeDecorator(new 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();
}
相关推荐
myNameGL16 分钟前
linux安装idea
java·ide·intellij-idea
青春男大17 分钟前
java栈--数据结构
java·开发语言·数据结构·学习·eclipse
HaiFan.1 小时前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
我要学编程(ಥ_ಥ)1 小时前
一文详解“二叉树中的深搜“在算法中的应用
java·数据结构·算法·leetcode·深度优先
music0ant1 小时前
Idea 添加tomcat 并发布到tomcat
java·tomcat·intellij-idea
计算机徐师兄2 小时前
Java基于SSM框架的无中介租房系统小程序【附源码、文档】
java·微信小程序·小程序·无中介租房系统小程序·java无中介租房系统小程序·无中介租房微信小程序
源码哥_博纳软云2 小时前
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
渊渟岳2 小时前
掌握设计模式--装饰模式
设计模式
忒可君3 小时前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言
斌斌_____3 小时前
Spring Boot 配置文件的加载顺序
java·spring boot·后端