1 定义
将抽象和实现解耦,使得两者可以独立地变化。
类图如下:

abstraction 抽象化角色,同时保存对一个实现化角色的引用
implementor 实现化角色,接口或抽象类,定义该角色的行为和属性
refinedabstraction 修正抽象化角色
concreteimplementor 具体实现化角色,实现接口或抽象类的方法和属性
2 代码示例
实现抽象和实现
/**
 * @author chiangtaol
 * @date 2020-12-11
 * @describe 实现化接口
 */
public interface Implementor {
    void doSomething1();
    void doSomething2();
}
/**
 * @author chiangtaol
 * @date 2020-12-11
 * @describe 实现化接口实现类
 */
public class ConcreteImplementor1 implements Implementor{
    @Override
    public void doSomething1() {
        System.out.println("实现类1方法1..");
    }
    @Override
    public void doSomething2() {
        System.out.println("实现类1方法2..");
    }
}
/**
 * @author chiangtaol
 * @date 2020-12-11
 * @describe 实现化接口实现类
 */
public class ConcreteImplementor2 implements Implementor{
    @Override
    public void doSomething1() {
        System.out.println("实现类2方法1..");
    }
    @Override
    public void doSomething2() {
        System.out.println("实现类2方法2..");
    }
}抽象化角色和实现类
/**
 * @author chiangtaol
 * @date 2020-12-11
 * @describe 抽象化角色
 */
public abstract class Abstraction {
    private Implementor implementor;
    public Abstraction(Implementor implementor){
        this.implementor = implementor;
    }
    public Implementor getImplementor() {
        return implementor;
    }
    public abstract void run();
}
/**
 * @author chiangtaol
 * @date 2020-12-11
 * @describe 具体抽象化角色
 */
public class RefinedAbstraction extends Abstraction{
    public RefinedAbstraction(Implementor implementor) {
        super(implementor);
    }
    @Override
    public void run(){
        super.getImplementor().doSomething1();
        super.getImplementor().doSomething2();
    }
}3 总结
3.1 优点
抽象和实现分离:为了解决继承缺点而提出的设计模式,该模式下,实现可以不受抽象的约束,不用再绑定到一个固定的抽象层次上。
优秀的扩展能力:抽象和继承的解耦的好处
实现细节对客户透明
3.2应用场景
不希望使用继承的场景
接口或抽象不稳定的场景
重用性要求较高的场景