装饰者模式
贴一个百度都是复制粘贴的定义:
装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。就增加功能来说,Decorator模式比生成子类更为灵活。
灵活两个字太重要了,这样我就可以把执行的顺序任意切换,因为都是这个角色的附加功能。我就想到英雄联盟中的不解释连招好像就可以这样玩。还记得大司马的奥巴马的连招:weaaqaa 。帅,哈哈。我就用我喜欢的金克斯角色解析一下,装饰者这样玩。
1.定义一个基础接口,一个移动方法,用于被装饰者实现:
public interface Technique {
void move();
}
2.定义一个金克斯角色,也就是装饰者去实现:
public class JINX implements Technique {
@Override
public void move() {
System.out.println("移动");
}
}
3.定义一个装饰者的抽象类,要与被装饰者具体对象实现同一个接口,并且要持有一个具体实例:
public class SuperTechnique implements Technique {
Technique technique;
SuperTechnique(Technique technique){
this.technique = technique;
}
@Override
public void move() {
technique.move();
}
}
4.具体的修饰者继承抽象类,平a:
public class ATechnique extends SuperTechnique{
ATechnique(Technique technique) {
super(technique);
}
public void attack(){
System.out.println("基础平A");
}
@Override
public void move() {
super.move();
attack();
}
}
5.Q技能:
public class QTechnique extends SuperTechnique {
QTechnique(Technique technique) {
super(technique);
}
public void guns(){
System.out.println("Q 枪炮交响曲");
}
@Override
public void move() {
super.move();
guns();
}
}
6.W技能:
public class WTechnique extends SuperTechnique{
WTechnique(Technique technique) {
super(technique);
}
public void electron(){
System.out.println("W 震荡电磁波");
}
@Override
public void move() {
super.move();
electron();
}
}
7.E技能:
public class ETechnique extends SuperTechnique{
ETechnique(Technique technique) {
super(technique);
}
public void grenade(){
System.out.println("E 嚼火者手雷");
}
@Override
public void move() {
super.move();
grenade();
}
}
8.R技能:
public class RTechnique extends SuperTechnique{
RTechnique(Technique technique) {
super(technique);
}
public void missile(){
System.out.println("R 超究极死神飞弹");
}
@Override
public void move() {
super.move();
missile();
}
}
9.F闪现:
public class Flashing extends SuperTechnique {
Flashing(Technique technique) {
super(technique);
}
public void flash(){
System.out.println("F 闪现");
}
@Override
public void move() {
super.move();
flash();
}
}
10.现在定义一个游戏玩家:
public class Player {
public static void main(String[] args) {
System.out.println("-------------------");
QTechnique qTechnique = new QTechnique(new JINX());
qTechnique.move();
System.out.println("------------------");
RTechnique rTechnique = new RTechnique(new QTechnique(new Flashing(new ETechnique(new WTechnique(new JINX())))));
rTechnique.move();
System.out.println("------------------");
RTechnique rTechnique2 = new RTechnique(new QTechnique(new QTechnique(new Flashing(new ATechnique(
new ATechnique(new ETechnique(new WTechnique(new JINX()))))))));
rTechnique2.move();
}
}
输出结果如下:
-------------------
移动
Q 枪炮交响曲
------------------
移动
W 震荡电磁波
E 嚼火者手雷
F 闪现
Q 枪炮交响曲
R 超究极死神飞弹
------------------
移动
W 震荡电磁波
E 嚼火者手雷
基础平A
基础平A
F 闪现
Q 枪炮交响曲
Q 枪炮交响曲
R 超究极死神飞弹
Process finished with exit code 0
可以看出,采用最后一套不解释连招,可以直接五杀(doge),芜湖,起飞!
源码地址:https://github.com/viviandavid/spring-design-pattern