|
裝飾模式(結(jié)構(gòu)型模式) 裝飾模式(Decorator),動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來(lái)說(shuō),裝飾模式比生成子類(lèi)更為靈活。[DP]
自己的理解:在不對(duì)原有類(lèi)進(jìn)行修改的情況下動(dòng)態(tài)的對(duì)它進(jìn)行擴(kuò)展一些功能
優(yōu)點(diǎn):
缺點(diǎn):
Component:裝飾對(duì)象和被裝飾對(duì)象的共同父類(lèi) ConcreteComponent:被裝飾類(lèi),也為具體實(shí)現(xiàn)類(lèi) Decorator:裝飾類(lèi),自裝飾類(lèi)的父類(lèi) ConcreteDecoratorA:子裝飾類(lèi),提供特定的裝飾 ConcreteDecoratorB:子裝飾類(lèi),提供特定的裝飾 更多的ConcreteDecorator(C,D,E,F)
例子:武裝機(jī)甲,一臺(tái)機(jī)甲,沒(méi)有任何裝備,現(xiàn)在需要給機(jī)甲裝上各種裝備,機(jī)甲是被裝飾對(duì)象,給機(jī)甲新增裝備為裝飾類(lèi),動(dòng)態(tài)的添加武器裝備和防具裝備 被裝飾對(duì)象與裝飾對(duì)象的共同父類(lèi) /**
* @ Author :fonxi
* @ Date :2019/5/13 3:02
* @ Description:裝飾對(duì)象和被裝飾對(duì)象的共同父類(lèi)
*/
public interface Component {
void operation();
}
被裝飾對(duì)象,擁有完整的操作 /**
* @ Author :fonxi
* @ Date :2019/5/13 3:06
* @ Description:被裝飾者對(duì)象 機(jī)甲類(lèi)
*/
public class ConcreteComponent implements Component{
@Override
public void operation() {
System.out.println("末日機(jī)甲前來(lái)報(bào)道,裝備:");
}
}
裝飾類(lèi),持有一個(gè)被裝飾對(duì)象的引用,并且在被調(diào)用時(shí),調(diào)用被裝飾對(duì)象的方法 /**
* @ Author :fonxi
* @ Date :2019/5/13 3:09
* @ Description:裝飾類(lèi)
*/
public abstract class Decorator implements Component {
//持有一個(gè)被裝飾對(duì)象的引用
private Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
if(component != null){
component.operation();
}
}
}
子裝飾類(lèi),在調(diào)用提供特定的裝飾操作時(shí),調(diào)用父類(lèi)方法 /**
* @ Author :fonxi
* @ Date :2019/5/13 3:18
* @ Description:具體裝飾類(lèi) 機(jī)甲裝備武器改裝類(lèi)
*/
public class ConcreteDecoratorA extends Decorator{
@Override
public void operation() {
super.operation();
System.out.println("改裝:等離子高頻激光劍");
}
}
同上 /**
* @ Author :fonxi
* @ Date :2019/5/13 3:28
* @ Description:具體裝飾類(lèi) 機(jī)甲裝備防具改裝類(lèi)
*/
public class ConcreteDecoratorB extends Decorator{
@Override
public void operation() {
super.operation();
System.out.println("改裝:全適應(yīng)立場(chǎng)防護(hù)盾");
}
}
客戶(hù)端調(diào)用類(lèi) /**
* @ Author :fonxi
* @ Date :2019/5/13 3:00
* @ Description:客戶(hù)端調(diào)用類(lèi)
*/
public class TestController {
public void print(){
ConcreteComponent concreteComponent = new ConcreteComponent();
ConcreteDecoratorA cA = new ConcreteDecoratorA();
ConcreteDecoratorB cB = new ConcreteDecoratorB();
cA.setComponent(concreteComponent);
cB.setComponent(cA);
cB.operation();
}
}
輸出結(jié)果: 末日機(jī)甲前來(lái)報(bào)到,裝備: 改裝:等離子高頻激光劍 改裝:全適應(yīng)立場(chǎng)防護(hù)盾
裝飾模式能動(dòng)態(tài)的擴(kuò)展一個(gè)類(lèi),并且不修改原來(lái)的類(lèi),能夠靈活的增刪,比繼承要好。(感覺(jué)作用和代理模式有點(diǎn)象^_^) |
|
|
來(lái)自: 新進(jìn)小設(shè)計(jì) > 《待分類(lèi)》