装饰器模式
装饰器模式(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();
}