Java設計模式從精通到入門二 裝飾器模式
阿新 • • 發佈:2018-11-13
介紹
我儘量用最少的語言解釋總結:
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 發起了攻擊。。。
總結
注意裝飾抽象類需要實現你需要進行裝備的物件。並持有改物件的引用。然後測試類種的物件都是向上傳遞。