1辕漂、什么是裝飾器模式?
裝飾類(lèi)對(duì)被裝飾類(lèi)進(jìn)行封裝吴超,可以對(duì)原有的功能之上擴(kuò)展功能钉嘹。
2、有什么好處鲸阻?
裝飾類(lèi)和被裝飾類(lèi)可以獨(dú)立發(fā)展跋涣,不會(huì)相互耦合,裝飾模式是繼承的一個(gè)替代模式鸟悴,裝飾模式可以動(dòng)態(tài)擴(kuò)展一個(gè)實(shí)現(xiàn)類(lèi)的功能陈辱。
以監(jiān)控進(jìn)程這個(gè)功能為例
監(jiān)控器
public interface Monitor {
public String monitorProcess();
}
這個(gè)類(lèi)是已有的功能,用來(lái)監(jiān)控內(nèi)存
public class CacheMonitor implements Monitor {
@Override
public String monitorProcess() {
System.out.println("監(jiān)控內(nèi)存");
return null;
}
}
這個(gè)類(lèi)對(duì)Monitor 進(jìn)行裝飾细诸,具體實(shí)現(xiàn)由子類(lèi)實(shí)現(xiàn)
public abstract class MonitorDecorator implements Monitor{
protected Monitor monitor;
}
這個(gè)是MAT監(jiān)控內(nèi)存功能沛贪,只不過(guò)是多了個(gè)牌子,實(shí)際的監(jiān)控內(nèi)存功能還是由具體的Monitor實(shí)現(xiàn)
public class MATCacheMonitor extends MonitorDecorator {
public MATCacheMonitor(Monitor monitor){
this.monitor = monitor;
}
@Override
public String monitorProcess() {
monitor.monitorProcess();
// 監(jiān)控完內(nèi)存打印細(xì)節(jié)
printDetail();
return null;
}
private void printDetail(){
System.out.println("當(dāng)前已使用的內(nèi)存為18M");
}
}
main
public class Main {
public static void main(String[] args) {
Monitor monitor = new MATCacheMonitor(new CacheMonitor());
monitor.monitorProcess();
}
}
jdk的InputStream也是裝飾器實(shí)現(xiàn),像這樣
InputStream inputStream = new FileInputStream(new File(""));