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应用场景
不希望使用继承的场景
接口或抽象不稳定的场景
重用性要求较高的场景