裝飾器模式
裝飾器模式中主要有兩個角色:
- 裝飾器(夾克,帽子)
- 被裝飾的對象(老王)
裝飾器和被裝飾的對象有兩個特點,也是裝飾器模式的關鍵:
- 他們實現同一個接口
- 裝飾器中使用了被裝飾的對象
使用:
/** * <p> *定義一個接口 * </p> * * @author aodeng-低調小熊貓 * @since 19-7-11 */ public interface Person { /** * 計算累計消費 * @return */ public Double cost(); /** * 輸出信息 */ public void show(); }
/** * <p> *老王( 被裝飾的對象 )實現定義的接口 * </p> * * @author aodeng-低調小熊貓 * @since 19-7-11 */ public class LaoWang implements Person{ @Override public Double cost() { //沒消費,消費爲0 return 0.0; } @Override public void show() { System.out.println("老王我現在消費"+this.cost()); } }
/** * <p> *裝飾器超類,和被裝飾的對象實現同一個接口 Person : * </p> * * @author aodeng-低調小熊貓 * @since 19-7-11 */ public abstract class ClothesDecorator implements Person{ /** * 裝飾器中要使用被裝飾器的對象,構造方法中傳入 */ protected Person person; public ClothesDecorator(Person person){ this.person=person; } }
/** * <p> *具體的裝飾,夾克 * </p> * * @author aodeng-低調小熊貓 * @since 19-7-11 */ public class Jacket extends ClothesDecorator{ public Jacket(Person person){ /** * super 指向自己超(父)類 */ super(person); } @Override public Double cost() { //消費一件夾克 return person.cost()+100; } @Override public void show() { person.show(); System.out.println("老王我現在又消費了一件夾克100,累計用了"+this.cost()); } }
/** * <p> *具體的裝飾,帽子 * </p> * * @author aodeng-低調小熊貓 * @since 19-7-11 */ public class Hat extends ClothesDecorator{ public Hat(Person person){ //指向自己超(父)類 super(person); } @Override public Double cost() { return person.cost()+200; } @Override public void show() { person.show(); System.out.println("老王我現在又消費了一件帽子200,累計用了"+this.cost()); } }
測試
/** * <p> *程序入口 * </p> * * @author aodeng-低調小熊貓 * @since 19-7-11 */ public class LearnMain { public static void main(String[] args) { //創建一個老王 Person laoWang=new LaoWang(); //老王買了一件夾克 laoWang=new Jacket(laoWang); //老王買了一個帽子 laoWang=new Hat(laoWang); laoWang.show(); /* 控制檯輸出: 老王我現在消費0.0 老王我現在又消費了一件夾克100,累計用了100.0 老王我現在又消費了一件帽子200,累計用了300.0*/ } }
源碼
源碼地址: https://github.com/java-aodeng/hope
.ad:
人工智能被認爲是一種拯救世界、終結世界的技術。毋庸置疑,人工智能時代就要來臨了,科幻電影中的場景將成爲現實,未來已來! 詳情: