北风设计模式课程---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
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); } } } }