一、裝飾者模式簡(jiǎn)介
1. 定義
裝飾者模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu),該設(shè)計(jì)模式屬于結(jié)構(gòu)型模式漆改。這種設(shè)計(jì)模式創(chuàng)建一個(gè)裝飾類,用來包裝原有的類准谚,在裝飾類中既可以調(diào)用待裝飾類原有的方法挫剑,還可以增加新的方法,以擴(kuò)充原有類的功能氛魁。因此暮顺,裝飾者模式是一種用于替代繼承的技術(shù)。
2. 模式組成
- Component:一個(gè)抽象類或者一個(gè)接口秀存,定義了屬性或者方法捶码,是ConcreteComponent和ConcreteDecorator的共同父類;
- ConcreteComponent:Component子類或链,實(shí)現(xiàn)相應(yīng)的方法惫恼,是“被裝飾者”角色;
- Decorator:抽象裝飾類澳盐,維護(hù)一個(gè)指向ConcreteComponent對(duì)象的引用祈纯,通過該引用可以調(diào)用裝飾之前的方法,并通過其子類擴(kuò)展該方法叼耙,以達(dá)到裝飾的目的腕窥;
- ConcreteDecorator:具體裝飾類,是抽象裝飾類的子類筛婉,負(fù)責(zé)添加新的功能簇爆。
二、裝飾者模式實(shí)現(xiàn)
這里以王者榮耀里面給英雄穿戴皮膚為例爽撒,如果英雄穿戴了皮膚入蛆,那么ta將會(huì)有一定的皮膚加成,也就是說會(huì)變得更強(qiáng)一些硕勿。具體哨毁,以百里守約說明一下:
/**
* Component
* 一個(gè)接口:英雄
*/
public interface Hero {
public void skills();
}
/**
* ConcreteComponent
* 具體英雄:百里守約
*/
public class BailiShouYue implements Hero {
@Override
public void skills() {
System.out.println("我瞄準(zhǔn)很強(qiáng)!");
}
}
/**
* Decorator
* 抽象裝飾類:裝飾英雄
*/
public class HeroDecorator implements Hero {
protected Hero mHero;
public HeroDecorator(Hero hero) {
this.mHero = hero;
}
@Override
public void skills() {
mHero.skills();
}
}
/**
* ConcreteDecorator
* 具體裝飾類:穿戴皮膚
*/
public class SkinDecorator extends HeroDecorator {
public SkinDecorator(Hero hero) {
super(hero);
}
@Override
public void skills() {
super.skills();
System.out.println("穿上「特工魅影」的我更強(qiáng)了源武!");
}
}
測(cè)試代碼如下:
private void testDecorator() {
Hero bailiShouYue = new BailiShouYue();
SkinDecorator skinDecorator = new SkinDecorator(bailiShouYue);
skinDecorator.skills();
}
輸出結(jié)果:
我瞄準(zhǔn)很強(qiáng)扼褪!
穿上「特工魅影」的我更強(qiáng)了!
三粱栖、優(yōu)缺點(diǎn)
1. 優(yōu)點(diǎn)
- 裝飾模式比繼承更加靈活性迎捺,不會(huì)導(dǎo)致類的個(gè)數(shù)急劇增加;
- 裝飾模式可以動(dòng)態(tài)擴(kuò)展一個(gè)實(shí)現(xiàn)類的功能查排。
2. 缺點(diǎn)
- 多層裝飾比較復(fù)雜凳枝。