Java设计模式从精通到入门二 装饰器模式
介绍
我尽量用最少的语言解释总结:
Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构。
应用实例:
给英雄联盟种的射手,添加不同的装备。先装备攻速鞋,在装备电刀,最后装备无尽
uml类图如下
主要代码如下
ADC类:
/**
* @ClassName ADC
* @Description 英雄联盟射手
* @Author ouyangkang
* @Date 2018-11-13 08:49
**/
public interface ADC {
/**
* @Author ouyangkang
* @Description ADC 必备好吧 攻击 和赢得胜利
* @Date 8:50 2018/11/13
* @param
* @return void
**/
void attack();
/**
* @Author ouyangkang
* @Description 补刀是一个射手必备的素质
* @Date 8:51 2018/11/13
* @param
* @return void
**/
void repairKnives();
}
VN这个射手类
/**
* @ClassName VN
* @Description 薇恩 em... 最喜欢的射手之一
* @Author ouyangkang
* @Date 2018-11-13 08:53
**/
public class VN implements ADC {
@Override
public void attack() {
System.out.println("vn 发起了攻击。。。");
}
@Override
public void repairKnives() {
System.out.println("vn 开始补刀。。。");
}
}
ADC 装备抽象类
/**
* @ClassName DecorateEquipment
* @Description ADC 的装备 抽象类 也就是抽象装饰
*
* 要实现这个射手的接口,并持有改接口的引用
* @Author ouyangkang
* @Date 2018-11-13 08:56
**/
public abstract class DecorateEquipment implements ADC{
private ADC adc;
public DecorateEquipment(ADC adc){
this.adc = adc;
}
@Override
public void repairKnives(){
this.adc.repairKnives();
}
@Override
public void attack(){
this.adc.attack();
}
}
功速鞋类
/**
* @ClassName SpeedShoe
* @Description 攻速鞋 这件装备
* @Author ouyangkang
* @Date 2018-11-13 09:08
**/
public class SpeedShoe extends DecorateEquipment {
public SpeedShoe(ADC adc) {
super(adc);
}
@Override
public void repairKnives() {
// 装备着攻速鞋进行补刀
equipment();
super.repairKnives();
}
@Override
public void attack() {
// 装备着攻速鞋进行团战 杀人
equipment();
super.attack();
}
/**
* @Author ouyangkang
* @Description 装备
* @Date 9:03 2018/11/13
* @param
* @return void
**/
private void equipment(){
System.out.println("装备攻速鞋 提升攻速");
}
}
电刀类
/**
* @ClassName ElectricKnife
* @Description 电刀这件装备
* @Author ouyangkang
* @Date 2018-11-13 09:02
**/
public class ElectricKnife extends DecorateEquipment {
public ElectricKnife(ADC adc) {
super(adc);
}
@Override
public void repairKnives() {
// 装备着电刀进行补刀
equipment();
super.repairKnives();
}
@Override
public void attack() {
// 装备着电刀进行团战 杀人
equipment();
super.attack();
}
/**
* @Author ouyangkang
* @Description 装备
* @Date 9:03 2018/11/13
* @param
* @return void
**/
private void equipment(){
System.out.println("装备电刀这件武器。。。");
}
}
无尽类
/**
* @ClassName EndLess
* @Description 无尽 这件装备
* @Author ouyangkang
* @Date 2018-11-13 09:22
**/
public class EndLess extends DecorateEquipment {
public EndLess(ADC adc) {
super(adc);
}
@Override
public void repairKnives() {
equipment();
super.repairKnives();
}
@Override
public void attack() {
equipment();
super.attack();
}
private void equipment(){
System.out.println("装备着无尽 提高暴击和攻击力");
}
}
测试类
/**
* @ClassName main
* @Description 创建一个射手 向下传递
* @Author ouyangkang
* @Date 2018-11-13 09:10
**/
public class main {
public static void main(String[] args) {
// 创建一个射手
ADC vn = new VN();
// 第三 装无尽
vn = new EndLess(vn);
// 第二 装电刀
vn = new ElectricKnife(vn);
// 第一 装攻速鞋
vn = new SpeedShoe(vn);
vn.repairKnives();
System.out.println("-----------------------------");
vn.attack();
}
}
测试结果如下:
装备攻速鞋 提升攻速
装备电刀这件武器。。。
装备着无尽 提高暴击和攻击力
vn 开始补刀。。。
-----------------------------
装备攻速鞋 提升攻速
装备电刀这件武器。。。
装备着无尽 提高暴击和攻击力
vn 发起了攻击。。。
总结
注意装饰抽象类需要实现你需要进行装备的对象。并持有改对象的引用。然后测试类种的对象都是向上传递。