Java设计模式:装饰器模式

装饰器模式是一种设计模式,允许在不修改对象本身的情况下向其添加新功能。它通过创建包装原有对象的装饰类来实现,提供了比继承更灵活的扩展机制。文章提到了装饰器模式的应用场景,如扩展类功能或附加职责,以及它的优点,如保持代码开放封闭原则,允许动态组合功能。代码示例展示了如何使用装饰器模式为相机添加美颜和滤镜功能。
摘要由CSDN通过智能技术生成

装饰器模式

定义:

在不改变原有对象的基础上,将功能附加到对象上。

装饰器模式可以动态给对象添加一些额外的职责从而实现功能的拓展,在运行时选择不同的装饰器,从而实现不同的行为;比使用继承更加灵活,通过对不同的装饰类进行排列组合,创造出很多不同行为,得到功能更为强大的对象;符合“开闭原则”,被装饰类与装饰类独立变化,用户可以根据需要增加新的装饰类和被装饰类,在使用时再对其进行组合,原有代码无须改变。

应用场景:

扩展一个类的功能或给一个类附加职责。

当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能,也就是这些功能在编译时就需要确定了。那么有什么更好的方式实现功能的拓展吗?答案就是装饰器模式。

优点:

1)不改变原有对象的情况下,扩展新功能。
2)使用不同组合可以实现不同效果。
3)符合开闭原则。

代码示例:

Component:抽象构件,是定义一个对象接口,可以给这个对象动态地添加职责。

ConcreteComponent:具体构件,是定义了一个具体的对象,也可以给这个对象添加一些职责。

Decorator:抽象装饰类,继承自 Component,从外类来扩展 Component 类的功能,但对于Component 来说,是无需知道 Decorator 存在的。

ConcreteDecorator:具体装饰类,起到给 Component 添加职责的功能。

package com.test;

public class DecoratorMode {
    public static void main(String[] args) {
        // 使用相机拍照功能
        Component component = new ConcreteComponent();
        component.camera();
        // 使用相机的拍照和美颜功能
        component = new ConcreteDecorator(new ConcreteComponent());
        component.camera();
        // 使用相机的拍照、美颜和滤镜功能
        component = new ConcreteDecorator1(new ConcreteDecorator(new ConcreteComponent()));
        component.camera();
    }
}

// 定义被装饰者,以手机相机为例
interface Component{
    void camera();
}

// 最原始只有拍照功能
class ConcreteComponent implements Component{
    public void camera() {
        System.out.println("拍照功能...");
    }
}

abstract class Decorator implements Component{

    Component component;

    public Decorator(Component component) {
        this.component = component;
    }
}


// 添加美颜功能
class ConcreteDecorator extends Decorator{

    public ConcreteDecorator(Component component) {
        super(component);
    }

    public void camera() {
        // 调用原始方法
        component.camera();
        System.out.println("美颜功能...");
    }
}

// 添加滤镜功能
class ConcreteDecorator1 extends Decorator{

    public ConcreteDecorator1(Component component) {
        super(component);
    }

    public void camera() {
        // 调用原始方法
        component.camera();
        System.out.println("滤镜功能...");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值