• 设计模式组合模式


    定义:

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

    关键词:

    Composite

    结构图:

    image

    应用场景:

    表达的对象成"整体-部分"层次结构时.

    即表达的对象最后结果承树形时,可以采用组合模式.

    例如:

    中国移动下属3个品牌:全球通,神州行,动感地带.

    同时,中国移动下属有北京移动,天津移动,江苏移动等分公司.下属各分公司又包含3个品牌.

    各分公司又含有下属单位及相关品牌.

    这种树状结构的层次使用组合模式.

    实际上,品牌和公司并不是一个类可以描述的,但是为了使客户处理起来方便,可以不分复杂元素和简单元素,也可以使之如此设计.

    例子:

    类图:

    image

    代码:
    public abstract class Mobile
    {
        protected string name;
    	public Mobile(string name)
    	{
            this.name = name;
    	}
    
        public abstract void Add(Mobile m);
    
        public abstract void Remove(Mobile m);
    
        public abstract void Duty(int depth);
    }
    
    public class Easyown : Mobile
    {
    
        public Easyown(string name) : base(name)
    	{
            
    	}
    
        public override void Add(Mobile m)
        {
            
        }
    
        public override void Remove(Mobile m)
        {
           
        }
    
        public override void Duty(int depth)
        {
            HttpContext.Current.Response.Write(new string('-', depth) + name + "(轻松由我,神州行!)<br/>");
        }
    }
    
    public class M_Zone : Mobile
    {
        public M_Zone(string name)
            : base(name)
    	{
            
    	}
    
        public override void Add(Mobile m)
        {
            
        }
    
        public override void Remove(Mobile m)
        {
            
        }
    
        public override void Duty(int depth)
        {
            HttpContext.Current.Response.Write(new string('-', depth) + name + "(我的地盘,听我的!)<br/>");
        }
    }
    
    public class GoTone : Mobile
    {
        public GoTone(string name)
            : base(name)
    	{
            
    	}
    
        public override void Add(Mobile m)
        {
            
        }
    
        public override void Remove(Mobile m)
        {
            
        }
    
        public override void Duty(int depth)
        {
            HttpContext.Current.Response.Write(new string('-', depth) + name + "(我能!)<br/>");
        }
    }
    
    public class MobileCompany : Mobile
    {
        List<Mobile> al = new List<Mobile>(10);
    
        public MobileCompany(string name)
            : base(name)
    	{
            
    	}
    
        public override void Add(Mobile m)
        {
            al.Add(m);
        }
    
        public override void Remove(Mobile m)
        {
            al.Remove(m);
        }
    
        public override void Duty(int depth)
        {
            HttpContext.Current.Response.Write(new string('-', depth) + name + "<br/>");
    
            foreach(Mobile m in al)
            {
                m.Duty(depth+2);
            }
        }
    }
    页面调用:
        protected void Page_Load(object sender, EventArgs e)
        {
            Mobile m1 = new MobileCompany("中国移动");
    
            m1.Add(new Easyown("神州行"));
            m1.Add(new M_Zone("动感地带"));
            m1.Add(new GoTone("全球通"));
    
            Mobile m2 = new MobileCompany("江苏移动");
            m2.Add(new Easyown("神州行"));
            m2.Add(new M_Zone("动感地带"));
            m2.Add(new GoTone("全球通"));
    
            Mobile m3 = new MobileCompany("四川移动");
            m3.Add(new Easyown("神州行"));
            m3.Add(new M_Zone("动感地带"));
            m3.Add(new GoTone("全球通"));
    
            Mobile m31 = new MobileCompany("成都移动");
            m31.Add(new Easyown("神州行"));
            m31.Add(new M_Zone("动感地带"));
            m31.Add(new GoTone("全球通"));
    
            m3.Add(m31);
    
            m1.Add(m2);
            m1.Add(m3);
    
            m1.Duty(0);
        }
    效果:
    image 
  • 相关阅读:
    mysql用户授权及数据备份恢复
    mysql数据库导入导出 查询 修改表记录
    mysql数据库 索引 事务和事务回滚
    mysql数据库基本使用(增删改查)
    B-Tree 和 B+Tree
    网络七层模型及TCP、UDP,一次HTTP请求都发生了什么
    堆排、python实现堆排
    Linux 文件系统
    现有n 个乱序数,都大于 1000 ,让取排行榜前十,时间复杂度为o(n), top10, 或者 topK,应用场景榜单Top:10,堆实现Top k
    Ajax 基础
  • 原文地址:https://www.cnblogs.com/oneword/p/1513986.html
Copyright © 2020-2023  润新知