java 设计模式----装饰模式

本文深入探讨了装饰模式在软件设计中的应用,重点介绍了其在动态扩展功能方面的优势,以及与代理模式的区别。通过具体代码示例,展示了如何使用装饰模式增强实体类的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文从以下几个方面阐述装饰模式:

1.解决的问题:针对某个对象,或者实现同一个接口的一组对象,如果需要同时为这些对象增加某些功能(比如很多个功能),并且这些功能可以动态的添加时。1)如果在实体类接口中添加实现这些功能的方法,那么在每个实体类中都需要实现这些方法,很明显这不是一种好的扩展方法;2)如果采用子类的方式扩展功能,一旦扩展功能很多,就会有很多子类,造成类爆炸。这时,采用装饰模式是一个不错选的择

2.优点:从1中可以看出装饰模式具有动态扩展功能的作用;

3.缺点:多层装饰会很复杂

4.装饰模式与代理模式的区别:代理模式的主要作用是,控制被代理对象(如:通过一些逻辑判断是否使用被代理对象,即所谓的拦截对被代理对象的访问),而且代理类和被代理类需要实现同一个接口;而装饰模式的主要作用是,增强实体类的功能,并不会拦截对实体类的访问,并且外界可以直接访问实体类。下图展示了装饰模式中的类关系图

5.代码示例

public interface Shape {   //实体类接口
    void show ();
}

 

public class Retange implements Shape{  //实体类Retange
    public void show() {
        System.out.print("This is a retange!");
    }
}
public class Circle implements Shape {    //实体类Circle

    public void show() {
        System.out.print("This is a circle!");
    }
}

 

public class RedShapeDecorator extends ShapeDecorator {  //装饰类1
    public RedShapeDecorator(Shape shape) {
        super(shape);
    }

    @Override
    public void show() {
        super.show();
        setRed();
    }

    private void setRed() {
        System.out.println("set shape color Red!");
    }
}

 

 

public class BlueShapeDecorator extends ShapeDecorator {     //装饰类2

    public BlueShapeDecorator(Shape shape) {
        super(shape);
    }
    @Override
    public void show() {
        super.show();
        setBlue();
    }

    private void setBlue() {
        System.out.println("set shape color Blue!");
    }
}

 

public class TestDecorator {    //测试来
    public static void main(String[] args) {
        Circle circle = new Circle();
        RedShapeDecorator redShapeDecorator1 = new RedShapeDecorator(circle);
        redShapeDecorator1.show();
        RedShapeDecorator redShapeDecorator2 = new RedShapeDecorator(new Retange());
        redShapeDecorator2.show();
        BlueShapeDecorator blueShapeDecorator = new BlueShapeDecorator(circle);
        blueShapeDecorator.show();
    }
}

 

//测试结果如下:
This is a circle!set shape color Red!
This is a retange!set shape color Red!
This is a circle!set shape color Blue!

Process finished with exit code 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值