• 装饰者模式


    装饰者模式(java)

    什么是装饰者模式

    装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

    装饰者模式中的角色

    在这里插入图片描述

    • 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
    • 具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
    • 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
    • 具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

    抽象构件(Component)角色

    用动物接口作为抽象构件(Component)角色,动物会移动,和咬。

    public interface Animal {
    
        //移动
        void move();
    
    
        //咬
        void bite();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    具体构件(Concrete Component)角色

    用会跑会咬的狗狗类作为具体构件(Concrete Component)角色。

    public class Dog implements Animal{
    
        @Override
        public void move() {
            System.out.println("狗子在跑=========");
        }
    
        @Override
        public void bite() {
            System.out.println("狗子要咬你=========");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    装饰(Decorator)角色

    给动物设计装备,可以加强动物的技能(也就是方法)。

    public abstract class AnimalEquipment implements Animal{
    
        private Animal animal;
    
        public AnimalEquipment(Animal animal) {
            this.animal = animal;
        }
    
        @Override
        public final void move() {
            beforeMove();
            animal.move();
            afterMove();
        }
    
        @Override
        public final void bite() {
            beforeBite();
            animal.bite();
            afterBite();
        }
    
        /**
         * 移动前的能力增强
         */
        protected abstract void beforeMove();
    
        /**
         * 移动后的能力增强
         */
        protected abstract void afterMove();
    
        /**
         * 咬你前的能力增强
         */
        protected abstract void beforeBite();
    
        /**
         * 咬你后的能力增强
         */
        protected abstract void afterBite();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    具体装饰(Concrete Decorator)角色

    在装饰角色中我们设计了动物的装备,但是没有具体实现装备的功能,在此实现动物移动的加速装备。

    public class AnimalAcceleratorEquipment extends AnimalEquipment{
    
        public AnimalAcceleratorEquipment(Animal animal) {
            super(animal);
        }
    
        @Override
        protected void beforeMove() {
            System.out.println("打开加速引擎===========");
        }
    
        @Override
        protected void afterMove() {
            System.out.println("关闭加速引擎=============");
        }
    
        @Override
        protected void beforeBite() {
    
        }
    
        @Override
        protected void afterBite() {
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    有的小动物会被大的动物欺负,于是为他们设计一款攻击力增强装备来保护自己,在此实现。

    
    public class AnimalProtectionEquipment extends AnimalEquipment{
        public AnimalProtectionEquipment(Animal animal) {
            super(animal);
        }
    
        @Override
        protected void beforeMove() {
    
        }
    
        @Override
        protected void afterMove() {
    
        }
    
        @Override
        protected void beforeBite() {
            System.out.println("安装合金牙套=======");
        }
    
        @Override
        protected void afterBite() {
            System.out.println("取下合金牙套=========");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    测试

    public class Test {
        public static void main(String[] args) {
            Animal animal = new Dog();
            animal = new AnimalProtectionEquipment(animal);
            animal.bite();
            animal = new AnimalAcceleratorEquipment(animal);
            animal.move();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果
    在这里插入图片描述

  • 相关阅读:
    实例讲解Simulink的MATLAB Function模块
    一般需要输出的文档流程
    macOS使用官方安装包安装python
    群签名、环签名、盲签名
    基于PHP+MySQL共享自行车租赁管理系统的设计与实现
    数据挖掘(2)数据预处理
    工行(工银聚富通)-申请退款
    一文搞懂《前后端动态路由权限》
    解释一下Node.js中的事件循环(event loop)
    P1868 饥饿的奶牛
  • 原文地址:https://blog.csdn.net/qq_38785977/article/details/125550674