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

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

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

装璜器模式的定义:

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

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

代码实现

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

所以定义一个 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,一个乐观的码农,撰写乏味的文章。
如果这篇文章帮忙到你,请珍藏⭐点赞加关注,跟踪不迷路(◡‿◡)