• java设计模式之组合模式


    组合模式

      组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 "组合对象" 的含义。组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。经典案例:系统目录结构,网站导航结构等。(百度百科)

    组合模式UML图

    组合模式代码

    package com.roc.composite;
    /**
     * 公共对象声明
     * @author liaowp
     *
     */
    public abstract class Component {
    
        protected String name;
        
        public Component(String name){
            this.name=name;
        }
        
        public Component(){
        }
        
        public abstract void add(Component component);
        
        public abstract void remove(Component component);
        
        public abstract void display(int depth);
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
    }
    package com.roc.composite;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 枝节点类
     * @author liaowp
     *
     */
    public class ConcreteCompany extends Component{
    
        private List<Component> list;
        public ConcreteCompany(String name) {
            super(name);
            list=new ArrayList<Component>();
        }
        
        public ConcreteCompany(){
            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 depth) {
            StringBuilder sb = new StringBuilder("");
            for (int i = 0; i < depth; i++) {
                sb.append("-");
                }
                System.out.println(new String(sb) + this.getName());
                for (Component c : list) {
                c.display(depth + 2);
                }
        }
    }
    package com.roc.composite;
    /**
     * 叶子节点
     * @author liaowp
     *
     */
    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 depth) {
            StringBuilder sb = new StringBuilder("");
            for (int i = 0; i < depth; i++) {
                sb.append("-");
                }
                System.out.println(new String(sb) + this.getName());
        }
    
    }
    package com.roc.composite;
    /**
     * 组合模式
     * @author liaowp
     *
     */
    public class Client {
        public static void main(String[] args) {
            Component root=new ConcreteCompany("root");
            root.add(new Leaf("file A"));
            root.add(new Leaf("file B"));
            Component file=new ConcreteCompany("file1");
            file.add(new Leaf("file C"));
            file.add(new Leaf("file D"));
            root.add(file);
            root.display(1);
        }
    }

    组合模式适用场景 

      1.你想表示对象的部分-整体层次结构
      2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
  • 相关阅读:
    把C语言的指针按在地上摩擦!
    组合索引相关介绍
    ConcurrentModificationException异常
    chat和varchar的区别?
    二进制部署K8S集群(二十三)addons之安装部署dashboard
    二进制部署K8S集群(二十二)addons之安装部署ingress
    二进制部署K8S集群(二十一)addons之flanneld优化SNAT规则
    二进制部署K8S集群(二十)K8s服务暴露之NodePort型Service
    二进制部署K8S集群(十九)addons之安装部署coredns
    二进制部署K8S集群(十八)addons之flannel三种模型安装部署详解
  • 原文地址:https://www.cnblogs.com/liaoweipeng/p/5791049.html
Copyright © 2020-2023  润新知