首页 > 其他分享 >软件设计模式白话文系列(九)装饰者模式

软件设计模式白话文系列(九)装饰者模式

时间:2022-11-14 22:00:29浏览次数:49  
标签:combat Combat 软件设计 模式 public attack new 白话文 装饰

1、描述

通过把对象引入包含行为的特殊封装中来为对象增强功能的模式。

2、模式结构与实现逻辑

  • 具体业务类:这个类的对象就是需要被装饰者模式加强的对象。需要实现抽象装饰类。
  • 抽象装饰类:装饰基类,用来记录装饰行为的抽象类或者接口。
  • 装饰类:抽象装饰类的实现类,引入抽象装饰类的对象,重写装饰行为,并在父类方法之前或之后进行而外的行为。

实现装饰者模式的大体思路就是:装饰类引用并实现(继承)业务类相同的接口(父类),再重写接口(父类)方法时,调用引用对象的方法,再添加自己逻辑。

3、实战代码

通过装饰者模式给一个战士增加战斗能力。战士类实现攻击接口,各种武器实现攻击接口,给战士装饰各种武器。

/**
 * 具体业务类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-13 22:31:35
 */
public class Warrior implements Combat {

    @Override
    public void attack() {
        System.out.print("战士使用拳头攻击、");
    }
}

/**
 * 抽象装饰类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-13 22:32:32
 */
public interface Combat {
    void attack();
}

/**
 * 装饰类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-13 22:39:21
 */
public class Spear implements Combat {

    private Combat combat;

    public Spear(Combat combat) {
        this.combat = combat;
    }

    @Override
    public void attack() {
        combat.attack();
        System.out.print("长枪刺杀、");
    }
}

/**
 * 装饰类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-13 22:42:28
 */
public class Sword implements Combat {

    private Combat combat;

    public Sword(Combat combat) {
        this.combat = combat;
    }

    @Override
    public void attack() {
        combat.attack();
        System.out.print("刀剑劈砍、");
    }
}

/**
 * 测试类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-13 22:43:30
 */
public class Client {
    public static void main(String[] args) {
        Combat combat = new Warrior();
        combat.attack();
        System.out.println();

        Combat combat1 = new Spear(new Warrior());
        combat1.attack();
        System.out.println();

        Combat combat2 = new Sword(new Spear(new Warrior()));
        combat2.attack();
        System.out.println();

        Combat combat3 = new Spear(new Sword(new Warrior()));
        combat3.attack();
    }
}

执行结果:

就这样我们无需修改代码,也无需新建子类就可以轻松扩展原对象的功能。这里需要注意的是:我们装饰的顺序会直接影响我们最终结果,例如例子中的 combat2 和 combat3 因为枪和剑的装饰顺序不一致导致攻击时顺序就发生了改变。

4、适用场景

  • 希望不修改代码的前提扩展业务行为。
  • 业务类无法继承时,例如被 final 关键字修饰的类,可以使用装饰者模式进行扩展

5、装饰者模式和代理模式比较

相同点:

两者同属结构性设计模式,两个模式都能基于组合原则再不修改原有类的前提下对当前行为进行扩展功能。

不同点:

装饰者是对行为未知扩展,而代理模式是对已有行为进行扩展。

装饰者的功能扩展和生命周期由客户端控制,代理模式的意图在于保护和隐藏原有对象,扩展和生命周期由代理控制,客户端只是无感调用。

标签:combat,Combat,软件设计,模式,public,attack,new,白话文,装饰
From: https://www.cnblogs.com/eajur/p/16890599.html

相关文章

  • Reactor模式
    Reactor模式基本设计思想,简单来讲就是I/O复用结合线程池 Reactor模式,是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式。服务端程序处理传......
  • ActiveMQ经典的使用模式(利用多线程处理消费端)
    今天看视频,里面讲了一个经典的例子,是工作中很常用的,特此将这种模式记录下来.这个例子使用了ActiveMQ的选择器,也使用了之前学的自定义线程池.队列的使用,而且很好的利......
  • Spring框架中都用到了哪些设计模式 ?
    1.简单工厂模式简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得......
  • 线程隔离(舱壁模式)
    线程隔离(舱壁模式)1.线程隔离的实现方式线程隔离有两种方式实现:线程池隔离信号量隔离(Sentinel默认采用)线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身......
  • 设计模式之【建造者模式】使用java建造者模式优雅创建对象
    文章目录​​什么是建造者模式​​​​一步一步认清建造者模式​​​​1、传统方式创建对象​​​​2、建造者模式创建对象​​​​建造者模式优缺点​​​​建造者模式适用......
  • 学习笔记-《游戏编程模式》
    《游戏编程模式》全书内容梗概总结这是一篇超过万字读书笔记,总结了《游戏编程模式》一书中所有章节与内容的知识梗概。 目录与说明《游戏编程模式》一书中总共介绍......
  • Java中DCL单例模式设计
    概述单例:某个类,对外永远只有一个对象。实现步骤:/***单例模式:懒汉式套路基础上加入并发控制(synchronized、volatile),保证多线程环境下,对外始终只有一个对象。*1、......
  • 转载 从瀑布到敏捷——漫画解读软件开发模式变迁史
      这张图片从上向下,五个房间,分别是瀑布模型(waterfall),敏捷开发(agile),看板(KANBAN),SCRUM和精益软件开发(lean)。软件过程:软件工程是为了获得高质量软件所需要完成的一系列......
  • 工厂方法模式
    概述《设计模式》中对工厂方法模式的意图描述如下:定义一个创建对象的接口,让子类来决定实例化哪一个类。FactoryMethod使得一个类的实例化延迟到子类一般工厂方法模......
  • 软件设计模式白话文系列(八)桥接模式
    软件设计模式白话文系列(八)桥接模式1、描述把一个事物的多个维度剥离出来,通过组合方式来达到灵活设计的目的,Java中,我们一般是通过对象引用来替换继承关系,从而将抽象和实......