裝飾模式是一種用于替代繼承的技術叮贩,它通過一種無須定義子類的方式來給對象動態(tài)增加職責,使用對象之間的關聯(lián)關系取代類之間的繼承關系金蜀。
裝飾模式的定義:動態(tài)地給一個對象增加一些額外的職責荤懂。就擴展功能而言,裝飾模式提供了一種比使用子類更加靈活的替代方案弓乙。
裝飾模式的結構與實現(xiàn):
1.Component(抽象構件):它是具體構件和抽象裝飾類的共同父類末融,聲明了在具體構件中實現(xiàn)的業(yè)務方法,它的引入可以使客戶端以一致的方式處理未被裝飾的對象以及裝飾之后的對象暇韧,實現(xiàn)客戶端的透明操作勾习。
public abstract class Component {
public abstract void operation();
}
2.ConcreteComponent(具體構件):它是抽象構件類的子類,用于定義具體的構件對象锨咙,實現(xiàn)了在抽象構件中聲明的方法语卤,裝飾類可以給它增加額外的職責(方法)。
public class ConcreteComponent extends Component {
@Override
public void operation() {
System.out.println("裝飾模式具體構件酪刀!");
}
}
3.Decorator(抽象裝飾類):它也是抽象構件類的子類粹舵,用于給具體構件增加職責,但是具體職責在其子類中實現(xiàn)骂倘。它維護一個指向抽象構件對象的引用眼滤,通過該引用可以調(diào)用裝飾之前構件對象的方法,并通過其子類擴展該方法历涝,以達到裝飾的目的诅需。
public class Decorator extends Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operation() {
// 調(diào)用原有業(yè)務對象
component.operation();
}
}
4.ConcreteDecorator(具體裝飾類):它是抽象裝飾類的子類,負責向構件添加新的職責荧库。每一個具體裝飾類都定義了一些新的行為堰塌,他可以調(diào)用在抽象裝飾類中定義的方法,并可以增加新的方法用于擴充對象的行為分衫。
public class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
public void operation() {
//調(diào)用已有業(yè)務方法
super.operation();
//調(diào)用新增業(yè)務方法
addMethod();
}
public void addMethod() {
System.out.println("新增的業(yè)務方法场刑!");
}
}
5.Test:
public class Test {
public static void main(String[] args) {
Component component=new ConcreteComponent();
Component componentDe=new ConcreteDecorator(component);
componentDe.operation();
}
}
6.運行結果:
裝飾模式具體構件!
新增的業(yè)務方法蚪战!