你或者不相熟装璜器模式,然而漫威电影系列你必定并不生疏,在电影播出之后,或者你听过这样的声音:
一个紫色番薯,打了一个响指,泛滥超级英雄隐没一半。
可是番薯还是那个番薯,响指还是那个响指,是什么让这两个联合在一起领有了弱小的力量?答案就是:有限手套。电影很精彩,而与之偶合的是,手套的工艺和装璜器模式格调极为类似,所以明天就借来灭霸的手套,钻研钻研矮人族所制作的产品到底有如许神奇。
装璜器模式的定义:
容许向一个现有的对象增加新的性能,同时又不扭转其构造
🌰:手套每镶嵌一个宝石就减少一个超能力,而之前本来的能力更并不受影响,依然能够应用。这就是手套无敌的机密,也就是装璜器模式的魅力所在,让咱们看一下用代码是如何实现的。
代码实现
装璜器模式,须要让所有应用的类都来自同一个接口,只有“同一类型”能力相互装璜
所以定义一个 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,一个乐观的码农,撰写乏味的文章。
如果这篇文章帮忙到你,请珍藏⭐点赞👍加关注👀,跟踪不迷路 (🌻◡‿◡)