装饰模式(DecoratorPattern)

装饰模式是一种设计模式,允许在运行时为对象添加新的职责,而不必创建新的子类。它通过组合而非继承来扩展功能,提供了一种更灵活的替代方案。在装饰模式中,抽象组件定义了业务方法,具体构件实现这些方法,而装饰者持有组件的引用并调用其方法。通过装饰者,可以透明地给对象添加额外的功能,如在窗口上添加滚动条和黑色边框。这种模式强调装饰类与被装饰类接口的一致性,便于多次装饰。
摘要由CSDN通过智能技术生成

定义

动态的给一个对象增加一些职能,相对与生成子类更加灵活。

结构图

image

 

角色与理解

  • 装饰模式共分为四种角色:
    • Component(抽象构件):具体构件与抽象装饰类的共同父类,声明具体构件中实现的业务方法,它的出现能够让客户端一致的透明的对待装饰前和装饰后的类
    • ConcreteComponent(具体构件):抽象构件的子类,实现具体的业务方法
    • Decorator(抽象装饰类):抽象构件的子类,内部维持一个抽象构件的引用,通过该引用调用具体构件的业务方法
    • ConcreteDecorator(具体装饰类):抽象装饰类的实现类,声明并实现各种装饰方法实现对具体构件的装饰
  • 具体构件和装饰具体构件的抽象装饰类通过注入的方式被抽象装饰类继续装饰
  • 因为具体构件和抽象装饰类都继承抽象构件,所以被装饰时可以被同样的对待,更加灵活。

核心代码

抽象组件

public abstract class Component {
    /**
     * 需要装饰的方法
     */
    public abstract void display();
}

具体构件

public class Window extends Component {
    @Override
    public void display() {
        System.out.println("显示窗口");
    }
}
  • 抽象装饰类
@NoArgsConstructor
@AllArgsConstructor
public class ComponentDecorator extends Component {
    private Component component;
    @Override
    public void display() {
        component.display();
    }
}

具体装饰类

public class BlackBorderDecorator extends ComponentDecorator {
    public BlackBorderDecorator(Component component) {
        super(component);
    }
    @Override
    public void display() {
        super.display();
        System.out.println("显示黑色边框");
    }
}
public class ScrollBarDecorator extends ComponentDecorator {
    public ScrollBarDecorator(Component component) {
        super(component);
    }
    @Override
    public void display() {
        super.display();
        System.out.println("显示滚动条");
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        // 声明具体构件
        Component window = new Window();
        // 装饰具体构件,这里相当于将装饰后的构件重新变为具体构件,方便再次装饰
        ScrollBarDecorator decoratorSB = new ScrollBarDecorator(window);
        // 对装饰后的构件进行再一次的装饰
        BlackBorderDecorator decoratorBB = new BlackBorderDecorator(decoratorSB);
        // 先调用具体构件的放
        decoratorBB.display();
    }
}

注意事项

  • 尽量保持装饰类与被装饰类的接口相同,确保在客户端调用时能够被一致对待
  • 被装饰类尽量是一个“轻”类,较少的职能,通过装饰类对其进行扩展
  • 如果具体构件类只有一个,那么抽象装饰类可以直接是具体构件类的子类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值