桥接模式中一个重要的概念就是用关联组合代替继承,从而降低类与类之间的耦合和臃肿。比如一个绘制图形的功能,有圆形、正方形等不同的图形,它们还有不同的颜色。用继承关系设计可能像下面这样。可以看见类比较多
还有一种方案就是对图形和颜色进行组合得到想要的颜色图形。
所以对于有多个维度变化的系统,采用第二种方案系统中的类个数会更小,扩展方便。
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);
}
}
}