zoukankan      html  css  js  c++  java
  • 设计模式组合模式

    定义:

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

    关键词:

    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 
  • 相关阅读:
    Code Chef December Challenge 2018题解
    UOJ#419. 【集训队作业2018】圆形(格林公式)
    BZOJ2178: 圆的面积并(格林公式)
    LOJ#3052. 「十二省联考 2019」春节十二响(启发式合并)
    LOJ#3048. 「十二省联考 2019」异或粽子(trie树+堆)
    Code Chef MINPOLY(计算几何+dp)
    LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)
    LOJ#3087. 「GXOI / GZOI2019」旅行者(最短路)
    P5816 [CQOI2010]内部白点
    P5590 赛车游戏
  • 原文地址:https://www.cnblogs.com/oneword/p/1513986.html
Copyright © 2011-2022 走看看