zoukankan      html  css  js  c++  java
  • 设计模式之组合模式(Composite)

    组合模式个人理解:

    首先确定它的结构是一个树形,用生活中的比方来说:一个公司的总经理下面有很多副经理,副经理下面有很多秘书。这就是一个树形结构,作为总经理,可以管理手下的所有副经理和秘书,而副经理只能管理手下拥有的那些秘书,他不能管理不归他管理的秘书。这就是组合模式应用的点,对整体(总经理)的操作,影响下属的所有受管理的对象,而对部分(副经理)的操作,不会影响到总经理。这种设计模式的微妙确实很多,对外界来说,我可以更有层次的管理。至于其它优点,可以自己琢磨,网上也有人总结了这种模式的优点,不过都是有点太死板,不够实例化,比如:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性

    这里我的案例是文件夹的拷贝案例,文件夹以树形结构进行管理,然后进行拷贝工作。拷贝根文件夹会影响其下面的所有子文件夹,拷贝子文件夹,也会影响该子文件夹下面的所有文件夹(但不影响其父文件夹)先贴代码:

    FileInterface作为抽象接口,必须要实现addFile,removeFile子节点的方法以及访问这些子节点的方法copyFile()

    public interface FileInterface {
    
    	public void addFile(FileInterface f);
    
    	public void removeFile(FileInterface f);
    
    	public void copyFile();
    
    }
    
    import java.util.ArrayList;
    
    public class RootFile implements FileInterface {
    	String fileName;
    	public ArrayList<FileInterface> list = new ArrayList<FileInterface>();
    
    	public RootFile(String name) {
    		fileName = name;
    	}
    
    	@Override
    	public void addFile(FileInterface f) {
    		list.add(f);
    
    	}
    
    	@Override
    	public void copyFile() {
    		System.out.println("Copy " + fileName);
    		for (FileInterface f : list) {
    			f.copyFile();
    		}
    
    	}
    
    	@Override
    	public void removeFile(FileInterface f) {
    		list.remove(f);
    	}
    
    }
    
    //叶子文件夹不能再添加子文件夹
    public class LeafFile implements FileInterface {
    	String fileName;
    
    	public LeafFile(String name) {
    		fileName = name;
    	}
    
    	@Override
    	public void addFile(FileInterface f) {
    		System.out.println("叶子文件夹无法继续添加子文件夹");
    	}
    
    	@Override
    	public void copyFile() {
    		System.out.println("Copy " + fileName);
    
    	}
    
    	@Override
    	public void removeFile(FileInterface f) {
    		System.out.println("叶子文件夹下没有更多的子文件夹");
    
    	}
    
    }
    
    public class Main {
    	public static void main(String[] args) {
    		FileInterface root = new RootFile("Root");
    		FileInterface fa = new RootFile("A");
    		FileInterface fb = new RootFile("B");
    		FileInterface fa1 = new RootFile("A-1");
    		FileInterface fa2 = new RootFile("A-2");
    		FileInterface fa21 = new LeafFile("A-2-1");
    		FileInterface fa22 = new LeafFile("A-2-2");
    		FileInterface fa23 = new LeafFile("A-2-3");
    
    		root.addFile(fa);
    		root.addFile(fb);
    		fa.addFile(fa1);
    		fa.addFile(fa2);
    		fa2.addFile(fa21);
    		fa2.addFile(fa22);
    		fa2.addFile(fa23);
    
    		fa.copyFile();
    		System.out.println("====================分割线=======================");
    		//从fa2文件夹中删除子文件夹fa22
    		fa2.removeFile(fa22);
    		root.copyFile();
    
    	}
    }
    

    这时候的文件结构如下:


    程序运行结果:

    Copy A
    Copy A-1
    Copy A-2
    Copy A-2-1
    Copy A-2-2
    Copy A-2-3
    ====================分割线=======================
    Copy Root
    Copy A
    Copy A-1
    Copy A-2
    Copy A-2-1
    Copy A-2-3
    Copy B
    


    感觉有点想秦始皇时期的中央集权制的感觉。。。至此,组合模式的使用与学习也就感觉差不多了。

    总结:需要注意的点,首先有一个抽象的FileInterface来抽象出其所有子类,并留下共有的操作接口,add,remove,visit(我这里是copyFile)方法,然后是构建树形结构,需要使用的ArrayList来保存我们的子节点。还有就是visit(我这里是copyFile)方法里面的遍历迭代操作。

    项目源代码地址:http://www.kuaipan.cn/file/id_132802506211221451.htm?source=1


  • 相关阅读:
    第五章(6)Libgdx应用框架之接口
    java 源代码中动态加载JAR文件中的类
    curl: (60) SSL certificate problem: unable to get local issuer certificate 错误
    SVN和Git 介绍,区别,优缺点以及适用范围
    B2C电子商务系统研发——商品SKU分析和设计(一)
    电商ERP系统——商品SKU与库存设计
    PHP获取搜索引擎关键词
    一起谈.NET技术,使用VS2010为Windows7编写一个杀手级WPF应用 狼人:
    一起谈.NET技术,关于C# 中的Attribute 特性 狼人:
    一起谈.NET技术,Silverlight同步(Synchronous)调用WCF服务 狼人:
  • 原文地址:https://www.cnblogs.com/vokie/p/3602074.html
Copyright © 2011-2022 走看看