Java 设计模式学习--装饰器模型

2020-04-13  本文已影响0人  superHang

其实无论是代理模式还是装饰模式,本质上就是对原有对象增强的方式~
对象增强方式有下面几种方式

装饰器模式

就是动态拓展原有类的功能,加强原有类的功能,就比如手机,把手机当成一个类,原有的手机只能打电话,现在增强这个类的功能,可以看美女直播,玩游戏,买东西。。。就是增强了这个类的功能

设计狗的接口,以一只狗 狗蛋为例子

public interface Dog {
    void eat();
}

实现狗的接口,很久很久以前有一只狗叫做狗蛋,就会吃吃吃 和找隔壁的花花。。这两种技能

public class WhildDog implements Dog {

    @Override
    public void eat() {
        System.out.println("原来的狗蛋就会天天吃吃吃吃吃。。。。");
    }

    @Override
    public void findWomenDo() {
        System.out.println("原来的狗蛋就会天天吃吃吃吃吃,吃完找隔离的小母狗花花。。。然后 羞羞羞羞");
    }
}

抽象类--装饰器

//抽象类  装饰器 实现接口
public abstract class DecorateDog implements Dog {

    private Dog dog;
    //构造函数 实现狗的接口
    public DecorateDog(Dog dog){
        this.dog=dog;
    }

    //实现狗吃东西接口
    @Override
    public void eat(){
        dog.eat();
    }

    @Override
    public void findWomenDo(){
        dog.findWomenDo();
    }
}

开始给狗蛋加技能了,先是看门的技能,继承装饰器的抽象类,然后添加看门技能的方法,吃完东西学会看门了狗蛋

//继承装饰器的抽象类
public class GuardHouse extends  DecorateDog {

    public GuardHouse(Dog dog) {
        super(dog);
    }

    //拓展功能
    public void biteBadPerson(){
        System.out.println("后来的狗蛋学会了看门....");
    }

    @Override
    public void eat(){
       //调用父类的方法
       super.eat();
       //看门
       biteBadPerson();
    }

给狗蛋添加接飞碟的技能了,吃完东西,看门了,酒足饭饱之后玩飞碟啊,然后再去找花花 嘿嘿嘿

public class TaoHaoMaster extends DecorateDog {
    public TaoHaoMaster(Dog dog) {
        super(dog);
    }

    public void play(){
        System.out.println("吃完饭的狗蛋学会了玩飞碟,吸引隔离的花花");
    }

    @Override
    public void findWomenDo(){
        play();
        super.findWomenDo();
    }
}

执行看看,狗蛋一天的生活,new GuardHouse(dog) 新增了看门技能,new TaoHaoMaster(dog) 新增了接飞碟的技能,这两种技能对狗蛋进行了装饰,让狗蛋更加高大上了

    public static void main(String [] args){
            Dog dog=new WhildDog();
            dog=new GuardHouse(dog);
            dog=new TaoHaoMaster(dog);
            dog.eat();
            dog.findWomenDo();
image.png

其实下面这样简写就行,跟你经常玩的IO流系不系很像,啊哈IO就是用的装饰器模式嘛

        Dog dog=new TaoHaoMaster(new GuardHouse(new WhildDog()));
        dog.eat();
        dog.findWomenDo();

//上面这玩意跟玩IO流的时候是不是很像
 InputStream inputStream=
new BufferedInputStream(new FileInputStream(new File("C://狗蛋.jpg")));

参考了
https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484226&idx=1&sn=a354d872978fc5db79a012c27ab5277f&chksm=ebd74243dca0cb5515fcad1ecfeda6a329be38c30a82a1325a5a19e7f62b0fa3c74069eed24d&scene=21#wechat_redirect

上一篇 下一篇

猜你喜欢

热点阅读