当前位置: 首页 > article >正文

设计模式(四)装饰器模式

装饰器模式

1、意图

动态增加功能,相比于继承更加灵活

2、类图

Component(VisualComponent):定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent(TextView):定义一个对象,可以给这个对象添加一些职责。

Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。ConcreteDecorator(BorderDecorator、ScrollDecorator):向组件添加职责。

3、实现

public interface Component {
    void draw();
}
public class ConcreteComponent implements Component{

    @Override
    public void draw() {
        System.out.println("展示一个窗口");
    }
}

 抽象类实现接口

public abstract class Decorator implements Component{
    public Component component;

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

    @Override
    public void draw() {
        component.draw();
    }
}
public class ConcreteDecorator1 extends Decorator{
    ConcreteDecorator1(Component component) {
        super(component);
    }

    @Override
    public void draw() {
        System.out.println("给窗口加边框");
        super.draw();
    }
}
public class ConcreteDecorator2 extends Decorator{
    ConcreteDecorator2(Component component) {
        super(component);
    }

    @Override
    public void draw() {
        System.out.println("给窗口加滚动条");
        super.draw();
    }
}
public class test {
    public static void main(String[] args) {
        Component concreteComponent=new ConcreteComponent();
        Decorator decorator1=new ConcreteDecorator1(concreteComponent);
        decorator1.draw();
        System.out.println("------------------------------");
        Decorator decorator2=new ConcreteDecorator2(concreteComponent);
        decorator2.draw();
    }
}

4、效果 


http://www.kler.cn/a/391718.html

相关文章:

  • Vue 3 介绍及应用
  • (干货)Jenkins使用kubernetes插件连接k8s的认证方式
  • HarmonyOS SDK下的实践与探索
  • ️️一篇快速上手 AJAX 异步前后端交互
  • Springboot 启动端口占用如何解决
  • 【C++】C++11特性(上)
  • RHEL 网络配置(Linux网络服务器 09)
  • ubuntu20.04安装anaconda与基本使用
  • 黑马程序员Docker学习【持续更新】
  • 电子商务网站之首页设计
  • 【论文解读CVPR2024】Scaffold-GS: Structured 3D Gaussians for View-Adaptive Rendering
  • 【JavaEE进阶】Spring 事务和事务传播机制
  • 《硬件架构的艺术》笔记(二):时钟与复位
  • DAY6 线程
  • 情绪如何影响用户体验?
  • Unity 插件 - Project窗口资源大小显示
  • mysqldump命令搭配source命令完成数据库迁移备份
  • Spring Boot 的核心原理和工作机制
  • DAY111PHP开发框架THIKNPHP反序列化POP利用链RCE执行文件删除
  • React Native 全新架构来了
  • CCSK:面试云计算岗的高频问题
  • 观成科技:Vagent注入的内存马加密通信特征分析
  • 直播美颜SDK开发指南:实时美颜技术的架构与优化策略
  • 数学建模模型算法-Python实现
  • C语言中操作符详解(中)
  • 在服务器里安装2个conda