关于后端:装饰器模式藏在漫威电影里的设计模式

4次阅读

共计 2492 个字符,预计需要花费 7 分钟才能阅读完成。

你或者不相熟装璜器模式,然而漫威电影系列你必定并不生疏,在电影播出之后,或者你听过这样的声音:

一个紫色番薯,打了一个响指,泛滥超级英雄隐没一半。

可是番薯还是那个番薯,响指还是那个响指,是什么让这两个联合在一起领有了弱小的力量?答案就是:有限手套。电影很精彩,而与之偶合的是,手套的工艺和装璜器模式格调极为类似,所以明天就借来灭霸的手套,钻研钻研矮人族所制作的产品到底有如许神奇。

装璜器模式的定义:

容许向一个现有的对象增加新的性能,同时又不扭转其构造

🌰:手套每镶嵌一个宝石就减少一个超能力,而之前本来的能力更并不受影响,依然能够应用。这就是手套无敌的机密,也就是装璜器模式的魅力所在,让咱们看一下用代码是如何实现的。

代码实现

装璜器模式,须要让所有应用的类都来自同一个接口,只有“同一类型”能力相互装璜

所以定义一个 Equipment 接口示意咱们所有的配备,action 办法示意每个配备具备的性能

public interface Equipment {void action(); 
}

咱们定义两种场景:徒手戴宝石、手套镶嵌宝石

  • 徒手属于(天生自带)配备的一种,所以咱们实现 Equipment 接口实现 action 办法
public class Hand implements Equipment {
    @Override
    public void action() {System.out.println("手能够戴");
    }
}
  • 手套也是同理

    public class Glove implements Equipment {
      @Override
      public void action() {System.out.println("手套能够镶嵌");
      }
    }
  • 接下来咱们定义装璜类也就是 Diamond 宝石抽象类,因为宝石也是配备的一种,所以也须要实现 Equipment。而咱们的装璜有很多种宝石,所以定义装璜类用来实现多态从而装璜对象(手套、手)。

    public abstract class Diamond implements Equipment{
      Equipment equipment;
    
      public Diamond(Equipment equipment) {this.equipment = equipment;}
    
      @Override
      public void action() {equipment.action();
      }
    }

    结构器传入被装璜对象,这就是咱们结尾所提到的,所有应用的类都须要“同一类型”,这样能力将无论是原始对象,还是被装璜过的对象都能以 Equipment 类型传进去,从而再次装璜。

  • 创立三个宝石,实现 Diamond 抽象类,从而具体化每个宝石的性能
public class RedDiamond extends Diamond {public RedDiamond(Equipment equipment) {super(equipment);
    }

    @Override
    public void action() {super.action();
        System.out.println("红色事实宝石");
    }
}

留神在宝石子类外面,每个 action 办法都额定执行了 super.action 办法,每个被装璜对象的 action 办法都会被执行。联合起来,整体性能是这样的👇

给手套镶嵌绿宝石,在这根底上再镶嵌红宝石。每次执行宝石自身性能之前都会先去执行 super.action 直到执行了手套的性能后再返回执行宝石各自的性能,最终执行完所有性能。

  • 以此类推,额定两个宝石类

    public class GreenDiamond extends Diamond {public GreenDiamond(Equipment equipment) {super(equipment);
      }
    
      @Override
      public void action() {super.action();
          System.out.println("绿色工夫宝石");
      }
    }
    public class BlueDiamond extends Diamond {public BlueDiamond(Equipment equipment) {super(equipment);
      }
    
      @Override
      public void action() {super.action();
          System.out.println("蓝色空间宝石");
      }
    }
  • 测试代码:

    public class decoratorTest {public static void main(String[] args) {System.out.println("--------- 徒手 ----------");
          Equipment hand = new Hand();
          hand.action();
          System.out.println();
         
          Diamond redDiamond = new RedDiamond(hand);// 用红宝石装璜手
          redDiamond.action();
          System.out.println();
          
          Diamond greenAndRedDiamond = new GreenDiamond(redDiamond);// 持续用绿宝石装璜
          greenAndRedDiamond.action();
          
          System.out.println("--------- 戴手套 ----------");
          Equipment glove = new Glove();
          glove.action();
          System.out.println();
          
          Diamond greenDiamond = new GreenDiamond(glove);// 绿宝石装璜手套
          greenDiamond.action();
          System.out.println();
          
          Diamond blueDiamond = new BlueDiamond(glove);// 卸下绿宝石,镶嵌蓝宝石
          blueDiamond.action();}
    }
  • 运行后果:

能够看出,每个装璜类能够装璜本来对象,也能够装璜被装璜过的对象,各个装璜类之间互相独立,实现各自性能。

我是 Haoo,一个乐观的码农,撰写乏味的文章。
如果这篇文章帮忙到你,请珍藏⭐点赞👍加关注👀,跟踪不迷路 (🌻◡‿◡)

正文完
 0