• 文章
  • 在线工具

合成模式-JAVA设计模式

合成模式 JAVA设计模式
942

一、合成模式的英文是Composite,是一组对象的组合。

两个重要的概念:
1.组对象允许包含单对象(叶子对象),也可以包含其他的组对象。
2.为组对象和单对象的定义共同的行为
合成模式的意图是为了保证客户端调用单对象与组对象的一致性;
如图:

二、合成的模式是一个树结构,那么树的特征是什么:
1.存在一个没有任何引用指向自身的根节点(比如Object对象、根目录)

2.其他每个节点都只有一个引用该节点的父节点(叶子节点就只有一个父节点)

现在给大家举个反例子:

*我们看上图5.4,它不是一个树的结构:因为:List有两个指向,相当于是有两个父节点。那么如果把顶上的plant 和List去掉,剩下的部分就是树的结构


举个正例子:

根目录root文件下有两个文件夹(组件),一个是视频文件夹,里面有两个文件(叶子)。另一个是音乐文件夹(组件),里面有两个文件(叶子)


三、下面讲解如何用代码实现合成模式(组合模式),我就用上面的文件例子作为代码的实现:
/**
* 电脑文件接口
*
*/
interface WindowsInterfaceComponent {
void loadFiles();
}
/**
* 文件夹组件
*/
class FolderComposite implements WindowsInterfaceComponent {
//存放组件、叶子的容器
   private Set<WindowsInterfaceComponent> set = new HashSet<>();
   //当前文档名称
   private String name;
   public FolderComposite(String name){
this.name = name;
   }
@Override
   public void loadFiles() {
// TODO Auto-generated method stub
       System.out.println("文件夹 = "+name);
       Iterator<WindowsInterfaceComponent> items = set.iterator();
       while(items.hasNext()){
WindowsInterfaceComponent com = (WindowsInterfaceComponent)items.next();
           com.loadFiles();
       }
System.out.println("");
   }
//添加组件或叶子
   public void add(WindowsInterfaceComponent component){
set.add(component);
   }
}
/**
* 文件叶子
*/
public class FileLeaf implements WindowsInterfaceComponent {
private String name;
   public FileLeaf(String name){
this.name = name;
   }
@Override
   public void loadFiles() {
// TODO Auto-generated method stub
       System.out.println("文件名 = "+name);
   }
}

public class Main {
public static void main(String[] args) {
FolderComposite root = new FolderComposite("总文件夹");
       FolderComposite video = new FolderComposite("视频文件夹");
       video.add(new FileLeaf("Java视频.mp4"));
       video.add(new FileLeaf("JavaScript视频.mp4"));
       FolderComposite music = new FolderComposite("音乐文件夹");
       music.add(new FileLeaf("流行歌.mp3"));
       music.add(new FileLeaf("经典歌.mp3"));
       root.add(video);
       root.add(music);
       //加载文件
       root.loadFiles();
   }
}
注意:由于组合模式是由递归进行实现的,编写代码需要注意 防止死循环。



评论
或者使用社交账号快捷登录