龙空技术网

面试官:代理模式和装饰器模式的区别

维C动物园 257

前言:

眼前咱们对“设计模式有什么作用”大致比较关心,我们都想要分析一些“设计模式有什么作用”的相关内容。那么小编也在网上汇集了一些关于“设计模式有什么作用””的相关资讯,希望姐妹们能喜欢,兄弟们一起来了解一下吧!

通常在回答xxx模式与yyy模式的区别,第一印象就是要分清楚他们俩是不是同一类。

下面给大家整理设计模式分类:

从图中可以看出,代理模式和装饰器膜还是都属于结构型设计模式

下面我们通过代码案例来看这两个设计模式到底有什么区别:

代理模式案例:

// 定义接口interface Image {    void display();}// 被代理类class RealImage implements Image {    private String filename;        public RealImage(String filename) {        this.filename = filename;        loadFromDisk();    }        private void loadFromDisk() {        System.out.println("Loading image from disk: " + filename);    }        public void display() {        System.out.println("Displaying image: " + filename);    }}// 代理类class ImageProxy implements Image {    private String filename;    private RealImage realImage;        public ImageProxy(String filename) {        this.filename = filename;    }        public void display() {        if (realImage == null) {            realImage = new RealImage(filename);        }        realImage.display();    }}// 使用代理类public class ProxyPatternExample {    public static void main(String[] args) {        Image image = new ImageProxy("image.jpg");        image.display();    }}

装饰器模式案例:

// 定义接口interface Shape {    void draw();}// 具体实现类class Circle implements Shape {    public void draw() {        System.out.println("Drawing a circle");    }}// 装饰器类abstract class ShapeDecorator implements Shape {    protected Shape decoratedShape;        public ShapeDecorator(Shape decoratedShape) {        this.decoratedShape = decoratedShape;    }        public void draw() {        decoratedShape.draw();    }}// 具体装饰器类class RedShapeDecorator extends ShapeDecorator {    public RedShapeDecorator(Shape decoratedShape) {        super(decoratedShape);    }        public void draw() {        decoratedShape.draw();        setRedBorder();    }        private void setRedBorder() {        System.out.println("Adding red border");    }}// 使用装饰器类public class DecoratorPatternExample {    public static void main(String[] args) {        Shape circle = new Circle();        ShapeDecorator redCircle = new RedShapeDecorator(new Circle());                circle.draw();        redCircle.draw();    }}

这两个例子分别展示了代理模式和装饰器模式的使用方式和区别。

总结

代理模式和装饰器模式是两种不同的设计模式,虽然它们有一些共同的特点,但是在使用方式和实现上有一些区别。

区别如下:

目的不同:代理模式的主要目的是为了控制对对象的访问,而装饰器模式的主要目的是为了给对象添加额外的功能。关注点不同:代理模式关注于对对象的访问进行控制和管理,装饰器模式关注于对对象的功能进行增强。涉及的类不同:代理模式通常涉及到三个角色,即接口、代理类和被代理类,而装饰器模式通常只涉及一个接口和多个装饰器类。功能增强方式不同:代理模式通过在代理类中调用被代理类的方法实现功能增强,而装饰器模式通过在装饰器类中调用被装饰对象的方法,并在其前后添加额外的功能实现功能增强。

代理模式在项目中,用的最多的就是动态代理(比如:JDK、CGLib)。

标签: #设计模式有什么作用