裝飾者模式
1,定義
動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé)枷颊。
裝飾者模式通常有4個(gè)角色,就增加功能來(lái)說艾少,裝飾者模式比生成子類更加的靈活卡乾。
Component:抽象構(gòu)件。通常是一個(gè)接口或者抽象類缚够,定義最核心最原始的對(duì)象幔妨。
public interface AbstractComponent {
/**
* 抽象方法
*/
void operate();
}
ConcreteComponent:具體構(gòu)件。抽象構(gòu)件的實(shí)現(xiàn)谍椅,即被裝飾的對(duì)象误堡。
public class Component implements AbstractComponent {
@Override
public void operate() {
System.out.println("do something!");
}
}
Decorator:抽象裝飾者角色。通常是一個(gè)抽象類雏吭,可設(shè)置一個(gè)被裝飾對(duì)象锁施。
public abstract class Decorator implements AbstractComponent {
/** 定義一個(gè)裝飾構(gòu)件 **/
private AbstractComponent abstractComponent;
/**
* 通過構(gòu)造函數(shù)設(shè)置被裝飾者
* @param abstractComponent
*/
public Decorator(AbstractComponent abstractComponent) {
this.abstractComponent = abstractComponent;
}
/**
* 委托被裝飾著執(zhí)行
*/
@Override
public void operate() {
this.abstractComponent.operate();
}
}
ConcreteDecorator:具體裝飾者角色。實(shí)現(xiàn)對(duì)構(gòu)件的功能職責(zé)的擴(kuò)展杖们。
public class DecoratorOne extends Decorator {
/**
* 通過構(gòu)造函數(shù)設(shè)置被裝飾者
*
* @param abstractComponent
*/
public DecoratorOne(AbstractComponent abstractComponent) {
super(abstractComponent);
}
/**
* 定義自己的裝飾方法
*/
private void methodOne() {
System.out.println("DecoratorOne.methodOne 裝飾");
}
/**
* 重寫被裝飾對(duì)象的方法
*/
@Override
public void operate() {
this.methodOne();
super.operate();
}
}
public class DecoratorTwo extends Decorator {
/**
* 通過構(gòu)造函數(shù)設(shè)置被裝飾者
*
* @param abstractComponent
*/
public DecoratorTwo(AbstractComponent abstractComponent) {
super(abstractComponent);
}
/**
* 定義自己的裝飾方法
*/
private void methodTwo() {
System.out.println("DecoratorTwo.methodTwo 裝飾");
}
/**
* 重寫被裝飾對(duì)象的方法
*/
@Override
public void operate() {
super.operate();
this.methodTwo();
}
}
場(chǎng)景類
public class Client {
public static void main(String[] args) {
/** 定義被裝飾著 **/
AbstractComponent component = new Component();
/** 第一次裝飾 **/
component = new DecoratorOne(component);
/** 第二次裝飾 **/
component = new DecoratorTwo(component);
component.operate();
}
}
2.應(yīng)用
2.1 優(yōu)點(diǎn)
- 裝飾者及被裝飾者相互獨(dú)立悉抵,兩者解耦,提高系統(tǒng)的靈活性摘完。
- 裝飾者模式是繼承關(guān)系的替代方案姥饰,且不論被裝飾多少層,返回的對(duì)象仍然是該被裝飾者孝治。
- 裝飾者模式可以動(dòng)態(tài)的擴(kuò)展一個(gè)實(shí)現(xiàn)類的功能列粪。
2.2 缺點(diǎn)
- 多層裝飾會(huì)增加實(shí)現(xiàn)類的復(fù)雜度,減少裝飾類的數(shù)量可以降低系統(tǒng)的復(fù)雜度谈飒。
2.3 使用場(chǎng)景
- 動(dòng)態(tài)的為一個(gè)對(duì)象增加功能篱竭,且可以動(dòng)態(tài)的撤銷。
- 為一批實(shí)現(xiàn)類改裝或加裝功能步绸。