帮你整理了一份设计模式速查手册 (5)

帮你整理了一份设计模式速查手册

 

 桥接模式中一个重要的概念就是用关联组合代替继承,从而降低类与类之间的耦合和臃肿。比如一个绘制图形的功能,有圆形、正方形等不同的图形,它们还有不同的颜色。用继承关系设计可能像下面这样。可以看见类比较多

帮你整理了一份设计模式速查手册

 

 还有一种方案就是对图形和颜色进行组合得到想要的颜色图形。

帮你整理了一份设计模式速查手册

 

 所以对于有多个维度变化的系统,采用第二种方案系统中的类个数会更小,扩展方便。

abstract class Implementor
{
    public abstract void Operation();
}
class ConcreteImplementorA : Implementor
{
    public override void Operation()
    
{
        Console.WriteLine("具体实现A的方法执行");
    }
}
class ConcreteImplementorB : Implementor
{
    public override void Operation()
    
{
        Console.WriteLine("具体实现B的方法执行");
    }
}
class Abstraction
{
    protected Implementor implementor;
    public void SetImplementor(Implementor implementor)

        this.implementor 
= implementor;
    }
    public virtual void Operation()
    
{
        implementor.Operation();
    }
}
class RefinedAbstraction : Abstraction
{
    public override void Operation()
    
{
        implementor.Operation();
    }
}

客户端调用

Abstraction ab = new RefinedAbstraction();
ab.SetImplementor(new ConcreteImplementorA());
ab.Operation();
ab.SetImplementor(new ConcreteImplementorB());
ab.Operation();

如果系统可能有多个角度的分类,每一种角度都可能变化,就可以不用静态的继承连接,通过桥接模式可以使它们在抽象层建立关联关系。

4、Composite 组合

组合模式也就是部分整理关系,将对象组合成树形结构以表示“部分整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性,用于把一组相似的对象当做一个单一的对象。

帮你整理了一份设计模式速查手册

 核心就是让树枝和叶子实现统一的接口,树枝内部组合该接口,并且含有内部属性List放Component。

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);
}
class Leaf : Component
{
    public Leaf(string name) : base(name)
    
{ }
    public override void Add(Component c)
    
{
        Console.WriteLine("Cannot add to a leaf");
    }
    public override void Remove(Component c)
    
{
        Console.WriteLine("Cannot remove to a leaf");
    }
    public override void Display(int depth)
    
{
        Console.WriteLine(new string('-', depth) + name);
    }
}
class Composite : Component
{
    private List<Component> children = new List<Component> { };
    public Composite(string name) : base(name)
    
{ }

    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 component in children)
        {
            component.Display(depth + 2);
        }
    }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdydg.html