• 设计模式之—组合模式<CompositePattern>


    组合模式:将对象组合成树形结构以表示部门-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。整体和部分被一致对待。

    Component抽象类

    namespace CompositePattern.CLASS
    {
        abstract class Component
        {
            protected string name;
            public Component(string name)
            {
                this.name = name;
            }
    
            public abstract void Add(Component c);
            public abstract void Remove(Component c);
            public abstract void Display(int depth);
        }
    }
    View Code

    叶子类(Leaf)继承于 Component抽象类  透明方式重写Add()和Remove()

    namespace CompositePattern.CLASS
    {
        class Leaf:Component
        {
            public Leaf(string name)
                : base(name)
            { }
            public override void Add(Component c)
            {
            }
            public override void Remove(Component c)
            {
            }
            public override void Display(int depth)
            {
                Console.WriteLine(new String('-',depth) + name);
            }
        }
    }
    View Code

    Composite类 继承于 Component抽象类, 存储子部件包括叶和枝 <递归遍历树形结构>

    namespace CompositePattern.CLASS
    {
        class Composite:Component
        {
            public Composite(string name)
                : base(name)
            { }
    
            private List<Component> children = new List<Component>();
    
            public override void Add(Component c)
            {
                children.Add(c);
            }
            public override void Remove(Component c)
            {
                children.Remove(c);
            }
            public override void Display(int depth)
            {
                Console.WriteLine(new String('-',depth) + name);
    
                foreach (Component com in children)
                {
                    com.Display(depth + 1);
                }
            }
        }
    }
    View Code

    测试类(TestMain)

    namespace CompositePattern
    {
        class TestMain
        {
            static void Main(string[] args)
            {
                Composite root = new Composite("root");
                root.Add(new Leaf("LeafA"));
                root.Add(new Leaf("LeafB"));
    
                Composite com = new Composite("Branch");
                com.Add(new Leaf("BranchLeafA"));
                com.Add(new Leaf("BranchLeafB"));
                root.Add(com);
    
                Composite com1 = new Composite("Branch1");
                com1.Add(new Leaf("Branch1A"));
                com1.Add(new Leaf("Branch1B"));
                root.Add(com1);
    
                Leaf Leaf = new Leaf("LeafC");
                root.Add(Leaf);
                root.Remove(Leaf);
    
                root.Display(1);
    
                Console.WriteLine();
            }
        }
    }
    View Code

    测试结果:

    以下以公司结构为例,实现各个财务部和人力资源部的职责和结构

    公司抽象类(Company)

    namespace CompositePatternTest.CLASS
    {
        abstract class Company
        {
            protected string name;
            public Company(string name)
            {
                this.name = name;
            }
    
            public abstract void Add(Company c);
            public abstract void Remove(Company c);
            public abstract void Display(int depth); //显示
            public abstract void Duty(); //履行职责
        }
    }
    View Code

    财务部类(HRDepartment)继承于公司抽象类(Company)

    namespace CompositePatternTest.CLASS
    {
        class HRDepartment:Company
        {
            public HRDepartment(string name) : base(name) { }
    
            public override void Add(Company c)
            {
            }
            public override void Remove(Company c)
            {
            }
            public override void Display(int depth)
            {
                Console.WriteLine(new String('*',depth) + name);
            }
            public override void Duty()
            {
                Console.WriteLine("{0}人力资源部负责培训员工!",name);
            }
     
        }
    }
    View Code

    人力资源部类(FinanceDepartment)继承于公司抽象类(Company)

    namespace CompositePatternTest.CLASS
    {
        class FinanceDepartment:Company
        {
            public FinanceDepartment(string name) : base(name) { }
    
            public override void Add(Company c)
            {
            }
            public override void Remove(Company c)
            {
            }
            public override void Display(int depth)
            {
                Console.WriteLine(new String('*',depth) + name);
            }
            public override void Duty()
            {
                Console.WriteLine("{0}财务部负责公司财务管理!",name);
            }
     
        }
    }
    View Code

    具体公司(CreateCompany)继承于公司抽象类(Company)

    namespace CompositePatternTest.CLASS
    {
        class CreateCompany:Company
        {
            public CreateCompany(string name)
                : base(name)
            { }
    
            private List<Company> children = new List<Company>();
            public override void Add(Company c)
            {
                children.Add(c);
            }
    
            public override void Remove(Company c)
            {
                children.Remove(c);
            }
    
            public override void Display(int depth)
            {
                Console.WriteLine(new String('*',depth) + name);
                foreach(Company com in children)
                {
                    com.Display(depth + 1);
                }
            }
    
            public override void Duty()
            {
                foreach(Company com in children)
                {
                    com.Duty();
                }
            }
            
        }
    }
    View Code

    测试类(TestMain)

    namespace CompositePatternTest
    {
        class TestMain
        {
            static void Main(string[] args)
            {
                CreateCompany root = new CreateCompany("北京总公司");
                root.Add(new HRDepartment("总公司人力资源部"));
                root.Add(new FinanceDepartment("总公司财务部"));
    
                CreateCompany branch = new CreateCompany("上海华东分公司");
                branch.Add(new HRDepartment("上海华东分公司人力资源部"));
                branch.Add(new FinanceDepartment("上海华东分公司财务部"));
                root.Add(branch);
    
                CreateCompany branch1 = new CreateCompany("南京办事处");
                branch1.Add(new HRDepartment("南京办事处人力资源部"));
                branch1.Add(new FinanceDepartment("南京办事处财务部"));
                branch.Add(branch1);
    
                CreateCompany branch2 = new CreateCompany("杭州办事处");
                branch2.Add(new HRDepartment("杭州办事处人力资源部"));
                branch2.Add(new FinanceDepartment("杭州办事处财务部"));
                branch.Add(branch2);
    
                Console.WriteLine("结构图");
                root.Display(1);
    
                Console.WriteLine("职责");
                root.Duty();
    
                Console.ReadLine();
    
            }
        }
    }
    View Code

    测试结果:

    要么忍,要么狠,要么滚!
  • 相关阅读:
    【AAAI2022】ShiftVIT: When Shift Operation Meets Vision Transformer
    【CVPR2021】Decoupled dynamic filter networks
    【ICLR2022】CrossFormer: A versatile vision transformer
    【ECCV2020】Spatially Adaptive Inference with Stochastic Feature Sampling and Interpolation
    【CVPR2022】Restormer: Efficient Transformer for HighResolution Image Restoration
    CondConv代码解析
    【ICCV2021】Context Reasoning Attention Network for Image SuperResolution
    【CVPR2021】Dynamic RegionAware Convolution
    【ARXIV2202】Visual Attention Network
    HybridSN代码修改
  • 原文地址:https://www.cnblogs.com/zxd543/p/3258542.html
Copyright © 2020-2023  润新知