Decouple an abstraction from its implementation so that the two can vary independently.
Participants
- Abstraction: defines the abstraction's interface. Maintains a reference to an object of type Implementor.
- RefinedAbstraction: extends the interface defined by Abstraction.
- Implementor: defines the interface for implementation classes. This interface doesn't have to correspond exactly to Abstraction's interface; in fact, the two interfaces can be quite different. Typically the Implementation interface provides only primitive operations, and Abstraction defines higher-level operations based on these primitives.
- ConcreteImplementor: implements the Implementor interface and defines its concrete implementation.
Code
public class Main { public static void main(String[] args) { Abstraction ab = new RefinedAbstraction(); ab.implementor = new ConcreteImplementorA(); ab.operation(); ab.implementor = new ConcreteImplementorB(); ab.operation(); } } public class Abstraction { protected Implementor implementor; public void setImplementor(Implementor implementor) { this.implementor = implementor; } public void operation() { implementor.operation(); } } public interface Implementor { public void operation(); } public class RefinedAbstraction extends Abstraction { @Override public void operation() { implementor.operation(); } } public class ConcreteImplementorA implements Implementor { @Override public void operation() { System.out.println("ConcreteImplementorA Operation"); } } public class ConcreteImplementorB implements Implementor { @Override public void operation() { System.out.println("ConcreteImplementorB Operation"); } }
Output
ConcreteImplementorA Operation ConcreteImplementorB Operation
Top comments (0)