装饰器模式和代理模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。

应用:

  • 基础字体-->斜体、加粗、改变字号
  • 武器--->加倍镜、加弹夹
  • 英雄--->升级增加技能
dart 复制代码
public class ADV {
    public static void main(String[] args) {
        Gun98K gun98K = new Gun98K();
        System.out.println(gun98K.getGunDescription());

        // 捡到了一个弹夹
        Magazine magazine = new Magazine(gun98K, 100);
        System.out.println(magazine.getGunDescription());

        // 又捡到了一个倍镜
        OpticalSight opticalSight = new OpticalSight(gun98K, 500);
        System.out.println(opticalSight.getGunDescription());
    }
}
interface Gun {
    int getAttack();
    int getDistance();
    String getGunDescription();
}
class Gun98K implements Gun {
    private String name = "98K";
    private int attack = 100;
    private int distance = 1000;
    @Override
    public int getAttack() {
        return attack;
    }

    @Override
    public int getDistance() {
        return distance;
    }

    @Override
    public String getGunDescription() {
        return name + " 攻击:" + attack + " 距离:" + distance;
    }
}
class GunAK47 implements Gun {
    private String name = "AK47";
    private int attack = 50;
    private int distance = 300;
    @Override
    public int getAttack() {
        return attack;
    }

    @Override
    public int getDistance() {
        return distance;
    }

    @Override
    public String getGunDescription() {
        return name + " 攻击:" + attack + " 距离:" + distance;
    }
}
abstract class Decorator implements Gun {
    protected Gun gun;
    public Decorator(Gun gun) {
        this.gun = gun;
    }
}

// 倍镜
class OpticalSight extends Decorator {
    public OpticalSight(Gun gun) {
        super(gun);
    }

    int distanceAdd;
    public OpticalSight(Gun gun, int distanceAdd) {
        super(gun);
        this.distanceAdd = distanceAdd;
    }

    @Override
    public int getAttack() {
        return gun.getAttack(); // 倍镜不增加攻击力
    }

    @Override
    public int getDistance() {
        return gun.getDistance() + distanceAdd; // 倍镜增加100的距离。
    }

    @Override
    public String getGunDescription() {
        return gun.getGunDescription() + " 倍镜(增加距离:" + distanceAdd + ")";
    }
}

// 弹夹
class Magazine extends Decorator {
    public Magazine(Gun gun) {
        super(gun);
    }

    int attackAdd;
    public Magazine(Gun gun, int attackAdd) {
        super(gun);
        this.attackAdd = attackAdd;
    }
    @Override
    public int getAttack() {
        return gun.getAttack() + attackAdd; // 增加10点攻击力
    }

    @Override
    public int getDistance() {
        return gun.getDistance();
    }

    @Override
    public String getGunDescription() {
        return gun.getGunDescription() + " 弹夹(增加攻击力:" + attackAdd + ")";
    }
}

代理模式和装饰器模式

代理模式和装饰器模式差不多。

代理模式是 "控制访问",装饰器模式是 "增强功能"。

虽然结构上相似(都有一层包装),但意图和场景的差异决定了它们是两种不同的设计模式。

动态代理在spring中有很多应用。

比如AOP、事务管理等。

相关推荐
小王不爱笑13221 小时前
Java 代理模式与 AOP 底层
java·开发语言·代理模式
我爱学习_zwj1 天前
设计模式-3(装饰器模式)
前端·设计模式·装饰器模式
青主创享阁2 天前
玄晶引擎XgenCore Works V2.8.1升级解析 技术迭代赋能场景 代理模式全新落地
大数据·人工智能·代理模式
阿猿收手吧!3 天前
【C++】建造者与代理模式实战解析
开发语言·c++·代理模式
Real-Staok4 天前
(集合)C / C++ 设计模式综合
单例模式·设计模式·代理模式
sg_knight4 天前
设计模式实战:代理模式(Proxy)
python·设计模式·代理模式·proxy
小江的记录本5 天前
【AOP】AOP-面向切面编程 (系统性知识体系全解)
java·前端·后端·python·网络协议·青少年编程·代理模式
学嵌入式的小杨同学5 天前
STM32 进阶封神之路(五):库函数移植全解析 —— 从底层原理到移植实操(含环境适配 + 报错解决)
vscode·单片机·嵌入式硬件·代理模式·智能硬件·pcb工艺·嵌入式实时数据库
weixin_403810136 天前
EasyClick iOS USB版本蓝牙点击坐标代码
ios·自动化·代理模式
蜜獾云6 天前
设计模式之代理模式:本地接口代理远程接口的调用
设计模式·系统安全·代理模式