装饰器模式(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、事务管理等。