zoukankan      html  css  js  c++  java
  • [工作中的设计模式]组合模式compnent

    一、模式解析

      将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。

    组合模式的要点是:

      1、对象整体以树形层次结构进行展示

      2、树的根节点和子节点均可以添加删除子节点,叶子节点无子节点

      3、可以通过节点的行为动作调用并展示他所有自己点的行为

      4、为了方便的实现无限节点的扩展,我们通常定义一个公共的接口,所有子节点和叶子节点均实现此接口

    二、模式代码

    1、公共接口,供所有子节点和叶子节点实现

    package component.patten;
    
    public abstract class Component {
        protected String name;
        public Component(String name){
            this.name=name;
        }
        public abstract void add(Component component);
        public abstract void remove(Component component);
        public abstract void display(int deepth);
        
    }

    2、叶子节点

    package component.patten;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Composite extends Component {
        public Composite(String name) {
            super(name);
        }
    
        List<Component> list=new ArrayList<Component>();
    
        @Override
        public void add(Component component) {
            list.add(component);
        }
    
        @Override
        public void remove(Component component) {
            list.remove(component);
        }
    
        @Override
        public void display(int deepth) {
            System.out.println(this.name);
                    //叶子节点的方法可以调用展示所有他的子节点的方法
            for(Component component:list){
                StringBuffer buffer=new StringBuffer();
                for (int i = 0; i < deepth; i++) {
                    buffer.append("--");
                }
                System.out.print(buffer);
                component.display(deepth+1);
            }
        }
    
    }
                

    3、叶子节点,叶子节点并不实现增加和删除方法,但是因为集成了接口,所以必须有

    package component.patten;
    
    public class Leaf extends Component {
    
        public Leaf(String name) {
            super(name);
        }
    
        @Override
        public void add(Component component) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void remove(Component component) {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void display(int deepth) {
            System.out.println("--"+this.name);
        }
    
    }

    4、客户端代码

    package component.patten;
    
    public class Client {
        public static void main(String[] args) {
            Component root=new Composite("root");
            Component com1=new Composite("com1");
            root.add(com1);
            Component leaf1=new Leaf("leaf1");
            Component leaf2=new Leaf("leaf2");
            Component leaf3=new Leaf("leaf3");
            com1.add(leaf1);
            com1.add(leaf2);
            com1.add(leaf3);
    
            Component com2=new Composite("com2");
            root.add(com2);
            Component leaf4=new Leaf("leaf2");
            com2.add(leaf4);
            
            root.display(1);
        }
    }

    5、执行结果

    root
    --com1
    ------leaf1
    ------leaf2
    ------leaf3
    --com2
    ------leaf2

    三、应用场景

      组合模式主要解决树形结构问题,比如集团与分子公司,电脑系统的文件夹和文件系统,系统中多级菜单,java集合框架中的List等方面进行使用,主要的要点就是对层级关系的添加和对子集信息的展示,以文件夹系统进行举例。

    四、场景代码

    1、定义文件的节点

    package component.example;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    public abstract class Node {
        protected String name;
        protected List<Node> list=new ArrayList<Node>();
        public Node(String name){
            this.name=name;
        }
        public abstract void add(Node node) throws Exception;
        public abstract void remove(Node node) throws Exception;
        public abstract void display(String path);
    }

    2、定义文件夹

    package component.example;
    
    /**
     * 文件夹
     * @author zjl
     * @time 2016-2-2
     *
     */
    public class Folder extends Node {
    
        public Folder(String name) {
            super(name);
        }
    
        @Override
        public void add(Node node) {
            list.add(node);
        }
    
        @Override
        public void remove(Node node) {
            list.remove(node);
        }
    
        @Override
        public void display(String path) {
            path+="/"+this.name;
            for(Node node:list){
                node.display(path);
            }
        }
    
    }

    3、定义文件

    package component.example;
    
    public class File extends Node {
    
        public File(String name) {
            super(name);
        }
    
        @Override
        public void add(Node node) throws Exception {
            throw new Exception("不支持此方法");
        }
    
        @Override
        public void remove(Node node) throws Exception {
            throw new Exception("不支持此方法");
        }
    
        @Override
        public void display(String path) {
            System.out.println(path+"/"+this.name);
        }
    
    }

    4、客户端

    package component.example;
    
    
    public class Client {
        public static void main(String[] args){  
            Folder document = new Folder("我的资料"); //我的资料文件夹  
            File book = new File("Java编程思想.pdf");  //文档文件  
            Folder music = new Folder("我的音乐");   //我的音乐文件夹  
            File music1 = new File("你是我的眼.mp3");   //音乐文件1  
            File music2 = new File("Without You.mp3");  //音乐文件2  
            //确定树形结构关系  
            document.add(book);  
            document.add(music);  
            music.add(music1);  
            music.add(music2);  
            
            document.display("");
            
        }
    }

    5、运行结果

    /我的资料/Java编程思想.pdf
    /我的资料/我的音乐/你是我的眼.mp3
    /我的资料/我的音乐/Without You.mp3
  • 相关阅读:
    无旋转Treap简介
    bzoj 4318 OSU!
    bzoj 1419 Red is good
    bzoj 4008 亚瑟王
    bzoj 1014 火星人prefix
    更多的莫队
    bzoj 3489 A simple rmq problem
    洛谷 2056 采花
    NOIP 2017 游(划水)记
    UVa 11997 K Smallest Sums
  • 原文地址:https://www.cnblogs.com/jyyzzjl/p/5184475.html
Copyright © 2011-2022 走看看