zoukankan      html  css  js  c++  java
  • GoF23种设计模式之结构型模式之组合模式

    一、概述

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

    二、适用性

    1.你想表示对象的部分--整体层次结构的时候。

    2.你希望用户忽略组合对象与单个对象的不同的时候,用户将统一地使用组合结构中的所有对象。

    三、参与者

    1.Component:为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并且在适当的情况下实现它。

    2.Leaf:在组合中表示叶节点对象,叶节点没有子节点。在组合中定义节点对象的行为。

    3.Composite:定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。

    4.Client:通过Component接口操作组合部件的对象。

    四、类图


    五、示例

    Component

    package cn.lynn.composite;
    
    import java.util.List;
    
    public abstract class Saint {
    
        private String name;
        
        protected List<Saint> saints;
        
        public List<Saint> getSaints() {
            return saints;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
        public void printInfo() {
            System.out.println(name);
        }
        
        protected abstract void obtain(Saint saint);
        
        protected abstract void deprive(Saint saint);
    
    }
    
    Leaf
    package cn.lynn.composite;
    
    public class BronzeSaint extends Saint {
    
        public BronzeSaint(String name) {
            super.setName(name);
            super.saints = null; // 青铜圣斗士已经是最低级的
        }
    
        @Override
        public void obtain(Saint saint) {
    
        }
    
        @Override
        public void deprive(Saint saint) {
    
        }
    
    }
    
    package cn.lynn.composite;
    
    public class SilverSaint extends Saint {
    
        public SilverSaint(String name) {
            super.setName(name);
            super.saints = null; // 白银圣斗士比青铜圣斗士强点
        }
    
        @Override
        public void obtain(Saint saint) {
    
        }
    
        @Override
        public void deprive(Saint saint) {
    
        }
    
    }
    
    Composite
    package cn.lynn.composite;
    
    import java.util.ArrayList;
    
    public class GoldSaint extends Saint {
    
        public GoldSaint(String name) {
            super.setName(name);
            super.saints = new ArrayList<Saint>(); // 还是黄金圣斗士牛逼,竟然会修圣衣
        }
    
        @Override
        public void obtain(Saint saint) {
            super.saints.add(saint);
        }
    
        @Override
        public void deprive(Saint saint) {
            super.saints.remove(saint);
        }
    
    }
    
    Client
    package cn.lynn.composite;
    
    import java.util.List;
    
    public class Client {
    
        public static void main(String[] args) {
            Saint goldSaint = new GoldSaint("穆先生");
            Saint silverSaint = new SilverSaint("魔铃");
            Saint bronzeSaint1 = new BronzeSaint("星矢");
            Saint bronzeSaint2 = new BronzeSaint("一辉");
            Saint bronzeSaint3 = new BronzeSaint("紫龙");
            
            goldSaint.obtain(silverSaint);
            goldSaint.obtain(bronzeSaint1);
            goldSaint.obtain(bronzeSaint2);
            goldSaint.obtain(bronzeSaint3);
            
            StringBuffer sb = new StringBuffer();
            sb.append(goldSaint.getName()+"指导");
            List<Saint> saints = goldSaint.getSaints();
            for (Saint saint : saints) {
                sb.append(saint.getName());
                sb.append("、");
            }
            sb = sb.deleteCharAt(sb.length() - 1);
            sb.append("修圣衣!");
            System.out.println(sb.toString());
        }
    
    }
    
    Result
    穆先生指导魔铃、星矢、一辉、紫龙修圣衣!
  • 相关阅读:
    vue项目 axios封装第二弹
    封装axios
    css基于文件格式使用不同的样式
    vue使用过程中的一些小技巧
    element-ui中单独引入Message组件的问题
    vue中axios复用封装
    OTA“多角恋”:携程闪电入股同程、途牛
    OTA(Online Travel Agent)
    网络时代
    互联网技术
  • 原文地址:https://www.cnblogs.com/innosight/p/3271150.html
Copyright © 2011-2022 走看看