装饰模式
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
在装饰模式中的各个角色有:
(1)抽象组件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
(2)具体组件(Concrete Component)角色:定义一个将要接收附加责任的类。
(3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。
UML
Hero.java 抽象组件英雄类
/**
* @Author: czn
* 英雄抽象类
* @Date 2020/11/18 20:36
*/
public interface Hero {
/**
* 展示装备
*/
public abstract void show();
}
Ashe.java 具体组件艾希
/**
* @Author: czn
* 艾希没有用装饰模式前的基础装备
* @Date 2020/11/18 20:40
*/
public class Ashe implements Hero {
public void show() {
System.out.println("出门多兰剑");
}
}
Decorator.java 装饰角色
/**
* @Author: czn
* 抽象装饰器
* @Date 2020/11/18 20:49
*/
public abstract class Decorator implements Hero {
Hero hero;
public Decorator(Hero hero) {
this.hero = hero;
}
public void show() {
hero.show();
}
}
Shoe.java 具体装饰鞋子
/**
* @Author: czn
* 具体装饰鞋子
* @Date 2020/11/18 21S:16
*/
public class Shoe extends Decorator {
public Shoe(Hero hero) {
super(hero);
}
@Override
public void show() {
super.show();
System.out.println("装备草鞋");
}
}
Sword.java 具体装饰无尽之刃
/**
* @Author: czn
* 具体装饰无尽之刃
* @Date 2020/11/18 21:13
*/
public class Sword extends Decorator {
public Sword(Hero hero) {
super(hero);
}
@Override
public void show() {
super.show();
System.out.println("装备无尽之刃");
}
}
Client.java 客户端
/**
* @Author: czn
* @Date 2020/11/18 21:18
*/
public class Client {
public static void main(String[] args) {
//生成艾希,装备多兰剑
Hero ashe = new Ashe();
/*--------开始装饰-------*/
//一血回家出草鞋
Shoe shoe = new Shoe(ashe);
//五杀出无尽
Sword sword = new Sword(shoe);
/*--------结束装饰-------*/
//展示当前装备
sword.show();
System.out.println("--------训练场模式一次性买完-------");
Hero ashe1 = new Sword(new Shoe(new Ashe()));
ashe1.show();
}
}
结果
出门多兰剑
装备草鞋
装备无尽之刃
--------训练场模式一次性买完-------
出门多兰剑
装备草鞋
装备无尽之刃