装饰器模式

装饰器模式

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

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

介绍

目的: 装饰器模式可以动态的增加对象的功能。在某些方面比继承更加灵活。

优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点: 比继承复杂。

角色: Component 类充当抽象角色,装饰类和被装饰类继承Component。

具体实现: Component是抽象构件,定义一个对象接口,可以给这些对象动态地添加职责;ConreteComponent定义一个具体对象,也可以给这个对象添加一些职责;Decorator是装饰抽象类,实现接口或抽象方法;ConreteDecorator是具体装饰对象,起到给Component添加职责的功能。。

在这里插入图片描述

示例

很多游戏的升级改造都可以看做装饰者模式,比如王者荣耀中的皮肤,可以给人物额外增加属性、技能,绝地求生中枪的配件,可以给枪增加能力。

模拟绝地求生,其中Gun为抽象构件,有一个被装饰类98k,一个抽象装饰类Configure,被一个装饰类4倍镜,一个装饰类扩容弹夹继承。装饰类和被装饰类都实现了抽象构件。

在这里插入图片描述

抽象构件Gun,有开火的功能

public interface Gun {

    public void fire();
}

被装饰类,实现了抽象构件的方法,开火。。。

public class Gun_98K implements Gun{
    @Override
    public void fire() {
        System.out.println("fire bom*10..,instence 1500m");
    }
}

抽象装饰类,实现了抽象构件,引用了抽象构件,构造方法可以接收抽象构件的实现类,也就是被装饰类。

public abstract class Configure implements Gun {
    private Gun gun;

    public Configure(Gun gun) {
        this.gun = gun;
    }

    @Override
    public void fire() {
        gun.fire();
    }

    public abstract void plus();//其他加强配置
}

实体装饰类,继承了抽象装饰类,继承其构造方法,实现了抽象方法plus,对呗装饰类的方法进行了重写(装饰)

//装饰类,弹夹
public class Magazine extends Configure {

    public Magazine(Gun gun) {
        super(gun);
    }


    @Override
    public void fire() {
        plus();
        System.out.println("fire ...bom*30...,instence 1500m");
    }

    @Override
    public void plus() {
        System.out.println("增加弹夹,发射更多子弹。。。");
    }
}

同上,实体装饰类

//倍镜装饰类
public class Magnification extends Configure {

    public Magnification(Gun gun) {
        super(gun);
    }

    @Override
    public void fire() {
        plus();
        System.out.println("fire..bom*10...,instence 6000m");
    }

    @Override
    public void plus() {
        System.out.println("增加倍镜,射程变远");
    }
}

主函数中的测试,装饰类中的构造函数都可以接收抽象构件的子类进行重写装饰。

 public static void main(String[] args) {
        //普通类
        Gun gun=new Gun_98K();
        gun.fire();

        //被装饰了弹夹的类
        gun=new Magazine(gun);
        gun.fire();
        
        //被装饰了倍镜的类
        gun=new Magnification(gun);
        gun.fire();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值