装饰器模式

乔欣 Java面经 发布时间:2022-11-15 15:57:15 阅读数:8867 1 架构设计面试题(2023版)
下文笔者讲述装饰器模式的简介说明,如下所示

装饰器模式简介

装饰器模式(Decorator Pattern):
     向一个现有的对象添加新的功能
     同时不改变原有的机构
装饰器模式属于结构型模式
    它主要采用对现有类进行包装而产生一个新类,这就是装饰器的魅力之处 

注意事项:
    1.装饰器模式相对生成子类的方式更加灵活
    2.装饰器模式可避免产生更多的子类,而导致子类爆炸 
例:
创建一个Shape接口
实现Shape接口实体类
创建一个实现Shape接口的抽象装饰类ShapeDecorator
将Shape对象作为它的实例变量
RedShapeDecorator实现ShapeDecorator的实体类
RedShapeDecorator来装饰Shape对象
 
创建接口
Shape.java
public interface Shape {
    void draw();
}

创建实现接口实体类
Rectangle.java
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Shape: Rectangle");
    }
}

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

创建实现Shape 接口的抽象装饰类
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
    protected Shape decoratorShape;
    public ShapeDecorator(Shape decoratorShape) {
        this.decoratorShape = decoratorShape;
    }

    @Override
    public void draw() {
        decoratorShape.draw();
    }
}

创建扩展ShapeDecorator类的实体装饰类
RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator {
    public RedShapeDecorator(Shape decoratorShape) {
        super(decoratorShape);
    }

    @Override
    public void draw() {
        decoratorShape.draw();
        setRedBorder(decoratorShape);
    }

    private void setRedBorder(Shape decoratorShape) {
        System.out.println("Border Color: Red");
    }
}

----测试代码------
使用 RedShapeDecorator来装饰 Shape 对象
public class DecoratorPatternDemo {
    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();
    }
}
-----运行以上代码,将输出以下信息-------
Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaMianJing/202211/16684990774916.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者