意图:将抽象部分与实现部分分离,使它们可以独立的变化。
结构图:
public abstarct class Implementor{
public abstract void OperationImpl();
}
public abstarct class ConcreteImplementorA : Implementor{
public override void OperationImp(){
....
}
}
public abstarct class ConcreteImplementorB : Implementor{
public override void OperationImp(){
....
}
}
public abstract class Abstraction{
protected Implementor _implementor; //通过组合方式引入接口,相当于桥梁
//通过构造函数,初始化接口
protected Abstraction(Implementor implementor){
_implementor = implementor;
}
public abstract void Operation();
}
public class RefinedAbstraction : Abstraction{
public RefinedAbstraction(Implementor implementor) : base(implementor){}
public override void Operation(){
this._implementor. OperationImpl();
}
}
public class Client{
static void Main(){
var concreteA = new ConcreteImplementorA();
var refined = new RefinedAbstraction(concreteA);
refined. operation();
}
}
优点:把抽象接口与其实现解耦。抽象和实现可以独立扩展。实现细节对客户透明。
缺点:增加系统的复杂度。
使用场景:一个系统需要在抽象化角色和具体化角色之间添加更多灵活性。
一个类存在两个独立变化的维度,且两个维度都需要进行扩展。