美文网首页
Java 设计模式学习--装饰器模型

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

作者: superHang | 来源:发表于2020-04-13 16:35 被阅读0次

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

    • 继 承

    • 继承父类,子类扩展

    • 装饰器模式

    • 使用“包装”的方式来增强对象

    • 代理模式

    装饰器模式

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

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

    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

    相关文章

      网友评论

          本文标题:Java 设计模式学习--装饰器模型

          本文链接:https://www.haomeiwen.com/subject/kzngmhtx.html