Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
裝飾模式可以,可以動態(tài)地為一個對象(注意是對象,不是類)添加功能,而不是通過繼承來擴展整個類。
LCD- 最低共同點
/**
* Lowest Common Denominator
*/
public interface LCD {
void doIt();
}
核心被包裝類
/**
* 被包裝的核心類實現(xiàn)LCD
*/
public class Core implements LCD {
@Override
public void doIt() {
System.out.println("Core - I am closed for modification.");
}
}
裝飾器基類
/**
* 抽象裝飾器也實現(xiàn)LCD("is a LCD"),并且"has a LCD"
*/
public abstract class AbstractDecorator implements LCD {
// has a LCD
private LCD core;
public AbstractDecorator(LCD inner) {
core = inner;
}
public void doIt() {
if (core != null) {
core.doIt();
}
}
}
注意裝飾器基類不僅是一個LCD,同時擁有一個LCD。
具體裝飾器類
public class DecoratorA extends AbstractDecorator {
public DecoratorA(LCD inner) {
super(inner);
}
public void doIt() {
super.doIt();
doA();
}
private void doA() {
System.out.println("A");
}
}
public class DecoratorB extends AbstractDecorator {
public DecoratorB(LCD inner) {
super(inner);
}
public void doIt() {
super.doIt();
doB();
}
private void doB() {
System.out.println("B");
}
}
public class DecoratorC extends AbstractDecorator {
public DecoratorC(LCD inner) {
super(inner);
}
public void doIt() {
super.doIt();
doC();
}
private void doC() {
System.out.println("C");
}
}
執(zhí)行
public class Test {
public static void main(String[] args) {
DecoratorA a = new DecoratorA(new Core());
a.doIt();
System.out.println("-----------------------------------");
DecoratorB b = new DecoratorB(a);
b.doIt();
System.out.println("-----------------------------------");
// 一層一層的包裝
// 不需要去繼承Core類,就可以為其添加額外的功能
DecoratorC c = new DecoratorC(new DecoratorB(new DecoratorA(new Core())));
c.doIt();
}
}
類圖

decorator.png
參考: