北风设计模式课程---16、组合模式

北风设计模式课程---16、组合模式

一、总结

一句话总结:

不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例
设计模式都是对生活的抽象,比如用户获得装备,我可以先装备工厂先生产出来装备,然后给宗门武器库,宗门武器库发给我,如果是打怪获得的装备,可以是装备工厂把装备给的怪物装备库

 

1、什么是组合模式?

树:树枝+叶子:通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。

Composite模式也叫组合模式,是构造型的设
计模式之一。通过递归手段来构造树形的对象结
构,并可以通过一个对象来访问整个对象树。

 

2、组合模式的角色和职责?

Component(树形结构的节点抽象):比如文件接口
Leaf(树形结构的叶节点):比如文件
Composite(树形结构的枝节点):比如文件夹

 

Component (树形结构的节点抽象)
- 为所有的对象定义统一的接口(公共属性,行为等的定义)
- 提供管理子节点对象的接口方法
- [可选]提供管理父节点对象的接口方法

Leaf (树形结构的叶节点)
Component的实现子类

Composite(树形结构的枝节点)
Component的实现子类

 

3、组合模式参考代码的角色实例?

Component(树形结构的节点抽象):比如文件接口:File.java
Leaf(树形结构的叶节点):比如文件:IFile.java
Composite(树形结构的枝节点):比如文件夹:Folder.java
客户端调用:MainClass.java

 

 

 

二、内容在总结中

1、相关知识

Component(树形结构的节点抽象):比如文件接口:File.java
Leaf(树形结构的叶节点):比如文件:IFile.java
Composite(树形结构的枝节点):比如文件夹:Folder.java
客户端调用:MainClass.java

 

2、代码

Component(树形结构的节点抽象):比如文件接口:File.java

import java.util.List;


public class File implements IFile {
    private String name;
    
    public File(String name) {
        this.name = name;
    }
    

    public void display() {
        System.out.println(name);
    }

    public List<IFile> getChild() {
        return null;
    }


    public boolean add(IFile file) {
        return false;
    }

    public boolean remove(IFile file) {
        return false;
    }

}

 


Leaf(树形结构的叶节点):比如文件:IFile.java

import java.util.List;

/*
 * 文件节点抽象(是文件和目录的父类)
 */
public interface IFile {
    
    //显示文件或者文件夹的名称
    public void display();
    
    //添加
    public boolean add(IFile file);
    
    //移除
    public boolean remove(IFile file);
    
    //获得子节点
    public List<IFile> getChild();
}

 


Composite(树形结构的枝节点):比如文件夹:Folder.java

import java.util.ArrayList;
import java.util.List;


public class Folder implements IFile{
    private String name;
    private List<IFile> children;
    
    public Folder(String name) {
        this.name = name;
        children = new ArrayList<IFile>();
    }
    

    public void display() {
        System.out.println(name);
    }

    public List<IFile> getChild() {
        return children;
    }


    public boolean add(IFile file) {
        return children.add(file);
    }


    public boolean remove(IFile file) {
        return children.remove(file);
    }


}

 


客户端调用:MainClass.java

import java.util.List;


public class MainClass {
    public static void main(String[] args) {
        //C盘
        Folder rootFolder = new Folder("C:");
        //beifeng目录
        Folder beifengFolder = new Folder("beifeng");
        //beifeng.txt文件
        File beifengFile = new File("beifeng.txt");
        
        rootFolder.add(beifengFolder);
        rootFolder.add(beifengFile);
        
        //ibeifeng目录
        Folder ibeifengFolder = new Folder("ibeifeng");
        File ibeifengFile = new File("ibeifeng.txt");
        beifengFolder.add(ibeifengFolder);
        beifengFolder.add(ibeifengFile);
        
        Folder iibeifengFolder = new Folder("iibeifeng");
        File iibeifengFile = new File("iibeifeng.txt");
        ibeifengFolder.add(iibeifengFolder);
        ibeifengFolder.add(iibeifengFile);
        
        displayTree(rootFolder,0);
        
    }
    
    public static void displayTree(IFile rootFolder, int deep) {
        for(int i = 0; i < deep; i++) {
            System.out.print("--");
        }
        //显示自身的名称
        rootFolder.display();
        //获得子树
        List<IFile> children = rootFolder.getChild();
        //遍历子树
        for(IFile file : children) {
            if(file instanceof File) {
                for(int i = 0; i <= deep; i++) {
                    System.out.print("--");
                }
                file.display();
            } else {
                displayTree(file,deep + 1);
            }
        }
    }
}

 

 

 

 

转载于:https://www.cnblogs.com/Renyi-Fan/p/11031928.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值