其實(shí)無論是代理模式還是裝飾模式,本質(zhì)上就是對(duì)原有對(duì)象增強(qiáng)的方式~
對(duì)象增強(qiáng)方式有下面幾種方式
繼 承
繼承父類,子類擴(kuò)展
裝飾器模式
使用“包裝”的方式來增強(qiáng)對(duì)象
代理模式
裝飾器模式
就是動(dòng)態(tài)拓展原有類的功能,加強(qiáng)原有類的功能,就比如手機(jī),把手機(jī)當(dāng)成一個(gè)類,原有的手機(jī)只能打電話,現(xiàn)在增強(qiáng)這個(gè)類的功能,可以看美女直播,玩游戲,買東西。。。就是增強(qiáng)了這個(gè)類的功能
設(shè)計(jì)狗的接口,以一只狗 狗蛋為例子
public interface Dog {
void eat();
}
實(shí)現(xiàn)狗的接口,很久很久以前有一只狗叫做狗蛋,就會(huì)吃吃吃 和找隔壁的花花。。這兩種技能
public class WhildDog implements Dog {
@Override
public void eat() {
System.out.println("原來的狗蛋就會(huì)天天吃吃吃吃吃。。。。");
}
@Override
public void findWomenDo() {
System.out.println("原來的狗蛋就會(huì)天天吃吃吃吃吃,吃完找隔離的小母狗花花。。。然后 羞羞羞羞");
}
}
抽象類--裝飾器
//抽象類 裝飾器 實(shí)現(xiàn)接口
public abstract class DecorateDog implements Dog {
private Dog dog;
//構(gòu)造函數(shù) 實(shí)現(xiàn)狗的接口
public DecorateDog(Dog dog){
this.dog=dog;
}
//實(shí)現(xiàn)狗吃東西接口
@Override
public void eat(){
dog.eat();
}
@Override
public void findWomenDo(){
dog.findWomenDo();
}
}
開始給狗蛋加技能了,先是看門的技能,繼承裝飾器的抽象類,然后添加看門技能的方法,吃完東西學(xué)會(huì)看門了狗蛋
//繼承裝飾器的抽象類
public class GuardHouse extends DecorateDog {
public GuardHouse(Dog dog) {
super(dog);
}
//拓展功能
public void biteBadPerson(){
System.out.println("后來的狗蛋學(xué)會(huì)了看門....");
}
@Override
public void eat(){
//調(diào)用父類的方法
super.eat();
//看門
biteBadPerson();
}
給狗蛋添加接飛碟的技能了,吃完東西,看門了,酒足飯飽之后玩飛碟啊,然后再去找花花 嘿嘿嘿
public class TaoHaoMaster extends DecorateDog {
public TaoHaoMaster(Dog dog) {
super(dog);
}
public void play(){
System.out.println("吃完飯的狗蛋學(xué)會(huì)了玩飛碟,吸引隔離的花花");
}
@Override
public void findWomenDo(){
play();
super.findWomenDo();
}
}
執(zhí)行看看,狗蛋一天的生活,new GuardHouse(dog) 新增了看門技能,new TaoHaoMaster(dog) 新增了接飛碟的技能,這兩種技能對(duì)狗蛋進(jìn)行了裝飾,讓狗蛋更加高大上了
public static void main(String [] args){
Dog dog=new WhildDog();
dog=new GuardHouse(dog);
dog=new TaoHaoMaster(dog);
dog.eat();
dog.findWomenDo();

image.png
其實(shí)下面這樣簡(jiǎn)寫就行,跟你經(jīng)常玩的IO流系不系很像,啊哈IO就是用的裝飾器模式嘛
Dog dog=new TaoHaoMaster(new GuardHouse(new WhildDog()));
dog.eat();
dog.findWomenDo();
//上面這玩意跟玩IO流的時(shí)候是不是很像
InputStream inputStream=
new BufferedInputStream(new FileInputStream(new File("C://狗蛋.jpg")));