zoukankan      html  css  js  c++  java
  • 设计模式之组合模式,温故而知新。

    概述:

       组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

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

     

    结构图:

     

    举例:

       假设我们公司有做个打卡的程序,能满足各种打卡的需要,比如整个公司能打卡,个人也能打卡(外包人员一个人支起一片天)。我们看看用组合模式是怎么实现的,这里不就讲怎么演化的了!演化的过程比较容易误导。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     public abstract class Company
        {
            protected string companyName;
            public string CompanyName
            {
                get
                {
                    return companyName;
                }
                set {
                    companyName = value;
                }
            }
            //添加公司
            public abstract void Add(Company name);
            //移除公司
            public abstract void Remove(Company name);
            //打卡
            public abstract void Register();
        }
     
        //个人
        public class Personal : Company
        {
            private string _name;
            public Personal(string name)
            {
                _name = name;
            }
     
            public override void Add(Company name)
            {
                //个人添加的能力,所以不实现
                throw new NotImplementedException();
            }
     
            public override void Remove(Company name)
            {
                //没有添加功能,所以不能删除
                throw new NotImplementedException();
            }
            //打卡
            public override void Register()
            {
                Console.WriteLine("{0}打卡了",_name);
            }
        }
        //一个公司
        public class WholeCompany : Company
        {
            List<Company> myList = new List<Company>();
            public override void Add(Company name)
            {
                myList.Add(name);
            }
     
            public override void Remove(Company name)
            {
                myList.Remove(name);
            }
     
            public override void Register()
            {
                Console.WriteLine("{0}", companyName);
                foreach (var item in myList)
                {
                     item.Register();
                }
            }
        }

    我们看看 客户端怎么调用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        class Program
        {
            static void Main(string[] args)
            {
     
                Company reg = new WholeCompany();
                reg.CompanyName = "本日打卡开始";
                //个体用户
                Personal p1 = new Personal("小A");
                Company p2 = new Personal("小B");
                reg.Add(p1);
                reg.Add(p2);
                 
                //公司用户
                WholeCompany beijing = new WholeCompany();
                beijing.CompanyName = "北京分公司";
                beijing.Add(new Personal("北京小王"));
                beijing.Add(new Personal("北京小黑"));
                reg.Add(beijing);
                 
                reg.Register();
                Console.ReadLine();
     
            }
        }

    执行结果:

    写到这里我们会发现,设计模式大多数都可以通用,同一种业务可以用很多种设计模式来做,但是只要我们弄清楚适用场景,就能选出一个更合适我们需求的设计模式。

    适用性:

    以下情况下适用Composite模式:
    1.你想表示对象的部分-整体层次结构
    2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

     

      

       设计模式系列文章入口

  • 相关阅读:
    可能是最简单的解决本地开发接口请求跨域问题的方案
    《Visual Studio程序员箴言》笔记
    vue后台项目记录
    新版本微信导致的ios表单bug
    longzhuapp项目笔记
    Session、LocalStorage、SessionStorage、Cache-Ctrol比较
    css3实现不同进度条
    axios请求接口的踩坑之路
    实现不同尺寸的图片在固定的区块内实现水平垂直居中
    for循环查找元素怎么跳出for循环
  • 原文地址:https://www.cnblogs.com/sc0791/p/3662000.html
Copyright © 2011-2022 走看看