• 组合模式(Composite Pattern)


    组合模式(Composite Pattern)

    其目的将单个对象和组合对象用相同的接口进行表示,使得客户端对单个对象和组合对象保持一致的方式处理。简而言之就是来继承同一个抽象类,常见的例子就是系统中的文件夹,一个目录下的文件、文件夹、文件都有相同的功能(展示、新增(文件没有)、删除等),所以我们就把他抽象成一个抽象类,使得对每个对单个对象的调用都是统一的。常见的两种模式

    • 安全模式(比如文件没有新增功能,那就不能对客户端暴露这个接口)
    • 透明模式(对文件、文件夹、目录的操作都是一样的,即使没有某个个体没有某个功能我们也可以进行调用因为他们继承的是同一个接口,这就违法了最少知道原则,所以本文中不进行阐述)

    一般公司的组织架构、文件夹这些都可以用这个来实现。

    通常来说:组合模式需要一个抽象组件、树枝节点、和叶子节点,下面用一个文件夹的例子进行举例说。

    To display

     First of all we should create root that is directory

    abstract class Directory {
        Directory(String name) {
            this.name = name;
        }
    
        String name;
        abstract  void  show();
    }

    Second we should create branch that is Folder(because each files are contained in Flolders)

    public class Folder extends Directory {
    // save all file ,you should not put File as restrictive condition,because you do not know how many file there are List<Directory> list; // we should consider its level then according this to arrange series Integer level; public Folder(String name, Integer level) { super(name); this.level = level; this.list = new ArrayList<Directory>(); } @Override void show() { System.out.println(this.name); for (Directory dir : this.list) { // code in block of if are used to show construction of Files,you can ignore the logic if (this.level != null) { for (int i = 0; i < this.level; i++) { System.out.print(" "); } for (int i = 0; i < this.level; i++) { if (i == 0) { System.out.print("+"); } System.out.print("-"); } } dir.show(); } } public boolean add(Directory directory) { return this.list.add(directory); } public void list() { for (Directory directory : list) { System.out.println(directory.name); } } }

    To test

    public static void main(String[] args) {
            Folder root = new Folder("root",1);
    
            File qq = new File("QQ.exe");
            File wx = new File("WeChat.exe");
    
    
            root.add(qq);
            root.add(wx);
    
            // working Folder
            Folder office = new Folder("softWare of working",2);
            File word = new File("Word.exe");
            File ppt = new File("PowerPoint.exe");
            File excel = new File("Excel.exe");
            office.add(word);
            office.add(ppt);
            office.add(excel);
    
            //This is a son Folder that  belong to  working Folder
            Folder wps = new Folder("KingSoft",3);
            wps.add(new File("WPS.exe"));
            office.add(wps);
    
    
            root.add(office);
    
            System.out.println("----------show()-----------");
            root.show();
    
            System.out.println("----------list()-----------");
            root.list();
        }

    as a  result

    We can assemble them easily with Composite Pattern.

    How is composite pattern applied into sorce of code

    java.util.HashMap#putAll

    java.util.ArrayList#addAll(java.util.Collection<? extends E>)

     apparently,Arraylist must be bound to  implements Connection(like list root we have mentioned

    org.apache.ibatis.scripting.xmltags.SqlNode#apply

    we open all of them at will, we will find them all pass on the same classes that is sqlNode

     

    Sum up

    advantage:

    • it is convenient to control the whole construction with a List( List<Directory> list)

    disadvantage:

    • it is hard to design the top class of interface(we have to  extract same point then construct our top interface/class)

  • 相关阅读:
    oracle pl/sql 中目录的创建
    oracle pl/sql中创建视图
    oracle pl/sql 函数中链表的使用
    oracle pl/sql 中的触发器
    (转载)gcc/g++打印头文件包含顺序和有效性
    (转载)Linux平台可以用gdb进行反汇编和调试
    (转载)轻量级Web服务器Lighttpd的编译及配置(for x86linux)
    (转载)浮点数的二进制表示
    gdb如何进行清屏
    gdb设置运行参数
  • 原文地址:https://www.cnblogs.com/UpGx/p/14734880.html
Copyright © 2020-2023  润新知