首页 > 其他分享 >设计模式之组合模式

设计模式之组合模式

时间:2024-04-01 14:59:01浏览次数:20  
标签:name 组合 void 模式 add new FileComponent 设计模式 public

概念:将对象组合成树形结构以表示“部分——整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

组合模式有三个角色:

  • 抽象构件:定义公有属性和方法。
  • 叶子结点:树形结构的底层结点,没有子结点,实现抽象构件的所有操作。
  • 中间结点:叶子结点之前的结点,有子结点。

组合模式最经典的例子就是文件和文件夹结构。下面用一个这样的例子来帮助大家理解组合模式。

public abstract class FileComponent {
    protected String name;
    public FileComponent(String name) {
        this.name = name;
    }
    public abstract void add(FileComponent component);
    public abstract void remove(FileComponent component);
    public abstract void display(int depth);
    public String getName() {
        return name;
    }
}

public class FileNode extends FileComponent {
    public FileNode(String name) {
        super(name);
    }
    @Override
    public void add(FileComponent component) {
        throw new UnsupportedOperationException("Cannot add components to a file.");
    }
    @Override
    public void remove(FileComponent component) {
        throw new UnsupportedOperationException("Cannot remove components from a file.");
    }
    @Override
    public void display(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("--");
        }
        System.out.println(sb + name);
    }
}

public class Directory extends FileComponent {
    private List<FileComponent> children;
    public Directory(String name) {
        super(name);
        children = new ArrayList<>();
    }
    @Override
    public void add(FileComponent component) {
        children.add(component);
    }
    @Override
    public void remove(FileComponent component) {
        children.remove(component);
    }
    @Override
    public void display(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("--");
        }
        System.out.println(sb + name);
        for (FileComponent child : children) {
            child.display(depth + 1);
        }
    }
}

public class Demo {
    public static void main(String[] args) {
        Directory root = new Directory("Root");
        Directory documents = new Directory("Documents");
        Directory pictures = new Directory("Pictures");
        FileNode readme = new FileNode("Readme.txt");
        FileNode image = new FileNode("image.jpg");
        root.add(documents);
        root.add(pictures);
        documents.add(readme);
        pictures.add(image);
        System.out.println("File structure:");
        root.display(0);
    }
}

标签:name,组合,void,模式,add,new,FileComponent,设计模式,public
From: https://blog.csdn.net/u012151345/article/details/137233486

相关文章

  • 打破传统消费模式,让每一次购物成为可持续的循环
    亲爱的朋友们,我是微三云的周丽,一名专注于私域电商模式创、新的探索者。私域运营的核心不应仅仅局限于不断的cu销,这样的ce略只会使xiao费者对品牌逐渐失去感觉。更高明的做法是利用场景ce略来深化与用户的联系,直击他们的ton点,使xiao费者自发产生购买yu望,从而提升转化率。循环......
  • C#中的设计模式
    设计模式在C#和WPF日常开发中扮演着重要角色,它们提供了一套通用的解决方案,用于解决软件设计中的常见问题。以下是关于设计模式的知识点,以及可能会在面试中被问到的一些问题和答案:设计模式的知识点:创建型模式:创建型模式用于处理对象的创建过程,包括单例模式、工厂模式、抽......
  • js 实现简单发布订阅模式
    1.事件调度器classEventEmitter{constructor(){this.events={};}on(event,listener){if(!this.events[event]){this.events[event]=[];}this.events[event].push(listener);}emit(event,...args){if(this.eve......
  • 【前端面试3+1】01闭包、跨域、路由模式
    一、对闭包的理解定义:闭包是指在一个函数内部定义的函数,并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。特点:闭包可以访问外部函数的变量,即使外部函数已经执行完毕。闭包可以保持外部函数的作用域不被销毁,从而延长变......
  • 设计模式,装修模式,Php代码演示,优缺点,注意事项
    装饰模式(DecoratorPattern)是一种结构型设计模式,它允许动态地向一个现有对象添加新的功能或行为,而不改变其原始结构。在PHP中,可以使用类的继承和组合来实现装饰模式。下面是一个简单的PHP装饰模式示例代码:首先,定义一个基类`Component`,它代表要装饰的对象:```phpabstract......
  • 什么时候使用静态方法,面向对象编程,设计模式,php编程
    静态方法在编程中有多种适用情况,以下是一些常见的使用场景:1.**工具类或辅助函数**:当你需要创建一个类来提供一些与类本身的实例无关的工具方法或辅助函数时,静态方法是很合适的。这些方法可以直接通过类名来调用,而无需创建类的实例。2.**计算或常量**:如果有一些计算或常量与......
  • Composite设计模式
    Composite设计模式虚函数继承与父类.又可以携带指针(Delegation)示例代码:component.h->统一父类#pragmaonce#ifndef__COMPONENT__#define__COMPONENT__​classComponent{intvalue;public:Component(intval):value(val){}//定义一个虚函数->......
  • 深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨
    ​......
  • 工厂方法模式与抽象工厂模式的深度对比
    ​......
  • UnrealEngine UnityBuild模式编译第三方代码问题
    UnrealEngine默认开了UnityBuild模式,把多个代码文件合并到一个较大的cpp文件进行编译。这样是为了减少总编译任务数,尽量避免单个编译任务代码内容太少导致在切换任务上消耗太多时间,尤其分布式编译情况下,任务切换成本更高。UnityBuild参考日志1>[22/102]Compile[x64]Module.......