設計模式之Decorator在餐館中的應用
Decorator定義:(動態給一個物件新增一些額外的職責,就象在牆上刷油漆.使用Decorator模式相比用生成子類方式達到功能的擴充顯得更為靈活.
為什麼使用Decorator?
我們通常可以使用繼承來實現功能的擴充,如果這些需要擴充的功能的種類很繁多,那麼勢必生成很多子類,增加系統的複雜性,同時,使用繼承實現功能擴充,我們必須可預見這些擴充功能,這些功能是編譯時就確定了,是靜態的。
使用Decorator的理由是:這些功能需要由使用者動態決定加入的方式和時機.Decorator提供了"即插即用"的方法,在執行期間決定何時增加何種功能。摘自(banq)
以到餐館去吃飯為例:
eatFood()是我們主要做的事,可是在此之前,要點菜askFood(),吃完之後要payMoney(),有時還要給服務員小費giveFee();
因此,除了eatFood之外的方法是"即插即用"的方法,在執行期間可以不給小費等等。
第一步>定義一介面:
public interface EatIF {
public void eatFood();
}
第二步>定義一decoratee(被刷油漆者)
public class EatSupper implements EatIF {
public EatSupper() { }
public String eatFood() {
System.out.println("一般地吃飯,是一個被刷油漆者。。。");
return "";
}
}
第三步>定義油漆工:
public class EatDecorator implements EatIF {
private EatIF eat;
private ArrayList additiveMove=new ArrayList();//吃飯前後的一些動作放在這裡
public EatDecorator(EatIF eatSupper) {
//EatDecorator往eatFood()新增其它方法,“刷油漆”
eat=eatSupper;//吃晚飯
additiveMove.add("用公款訂一桌子,地點在香格里拉。。。");
additiveMove.add("每位女服務員給小費50日元");
}
public void eatFood() {
askFood();
eat.eatFood();
giveFee ();
}
public void askFood (){
System.out.println("吃飯前的第一步"+additiveMove.get(0).toString());
}
public void giveFee (){
System.out.println("吃飯的最後一步"+additiveMove.get(1).toString());
}
}
第四步>呼叫:
public class TestDecorator {
public static void main(String[] args) {
EatIF eatSupper=new EatSupper();
EatIF eatDecorator=new EatDecorator(eatSupper);
eatDecorator.eatFood();
}
}
為什麼使用Decorator?
我們通常可以使用繼承來實現功能的擴充,如果這些需要擴充的功能的種類很繁多,那麼勢必生成很多子類,增加系統的複雜性,同時,使用繼承實現功能擴充,我們必須可預見這些擴充功能,這些功能是編譯時就確定了,是靜態的。
使用Decorator的理由是:這些功能需要由使用者動態決定加入的方式和時機.Decorator提供了"即插即用"的方法,在執行期間決定何時增加何種功能。摘自(banq)
以到餐館去吃飯為例:
eatFood()是我們主要做的事,可是在此之前,要點菜askFood(),吃完之後要payMoney(),有時還要給服務員小費giveFee();
因此,除了eatFood之外的方法是"即插即用"的方法,在執行期間可以不給小費等等。
第一步>定義一介面:
public interface EatIF {
public void eatFood();
}
第二步>定義一decoratee(被刷油漆者)
public class EatSupper implements EatIF {
public EatSupper() { }
public String eatFood() {
System.out.println("一般地吃飯,是一個被刷油漆者。。。");
return "";
}
}
第三步>定義油漆工:
public class EatDecorator implements EatIF {
private EatIF eat;
private ArrayList additiveMove=new ArrayList();//吃飯前後的一些動作放在這裡
public EatDecorator(EatIF eatSupper) {
//EatDecorator往eatFood()新增其它方法,“刷油漆”
eat=eatSupper;//吃晚飯
additiveMove.add("用公款訂一桌子,地點在香格里拉。。。");
additiveMove.add("每位女服務員給小費50日元");
}
public void eatFood() {
askFood();
eat.eatFood();
giveFee ();
}
public void askFood (){
System.out.println("吃飯前的第一步"+additiveMove.get(0).toString());
}
public void giveFee (){
System.out.println("吃飯的最後一步"+additiveMove.get(1).toString());
}
}
第四步>呼叫:
public class TestDecorator {
public static void main(String[] args) {
EatIF eatSupper=new EatSupper();
EatIF eatDecorator=new EatDecorator(eatSupper);
eatDecorator.eatFood();
}
}
相關文章
- 設計模式之--策略模式及其在JDK中的應用設計模式JDK
- 設計模式在 TypeScript 中的應用 – 策略模式設計模式TypeScript
- 轉載-Java設計模式之DecoratorJava設計模式
- 設計模式之裝飾器模式(decorator pattern)設計模式
- PHP設計模式之裝飾器模式(Decorator)PHP設計模式
- 設計模式在vue中的應用(一)設計模式Vue
- 設計模式在vue中的應用(七)設計模式Vue
- 設計模式在vue中的應用(六)設計模式Vue
- 設計模式在vue中的應用(三)設計模式Vue
- 設計模式在vue中的應用(二)設計模式Vue
- 設計模式在vue中的應用(四)設計模式Vue
- 設計模式在vue中的應用(五)設計模式Vue
- 設計模式應用場景之Model設計中可以用到的設計模式設計模式
- 設計模式 - 命令模式詳解及其在JdbcTemplate中的應用設計模式JDBC
- Decorator裝飾設計模式設計模式
- 設計模式-裝飾模式(Decorator Pattern)設計模式
- 設計模式--裝飾模式(Decorator Pattern)設計模式
- 設計模式 - 迭代器模式詳解及其在ArrayList中的應用設計模式
- 設計模式及其在spring中的應用(含程式碼)設計模式Spring
- PHP設計模式- Decorator 裝飾器模式PHP設計模式
- 設計模式中的俄羅斯套娃:裝飾者(Decorator)模式設計模式
- 【技巧篇】JavaScript設計模式之策略模式應用JavaScript設計模式
- C#設計模式-裝飾器模式(Decorator Pattern)C#設計模式
- 設計模式學習筆記(十六)迭代器模式及其在Java 容器中的應用設計模式筆記Java
- socket程式設計在TCP中的應用程式設計TCP
- AOP程式設計之AspectJ介紹及在Android中的應用程式設計Android
- .net core 中的經典設計模式的應用設計模式
- 淺談設計模式在iOS開發實戰專案中的應用設計模式iOS
- 前端常用設計模式(1)--裝飾器(decorator)前端設計模式
- 如何在程式碼中應用設計模式設計模式
- FMEA在架構設計中的應用分析架構
- FMEA在車門設計中的應用策略
- SoIidWorks在鈑金件設計中的應用
- 設計模式學習筆記(十三)組合模式及其在樹形結構中的應用設計模式筆記
- 設計模式學習筆記(十四)責任鏈模式實現以及在Filter中的應用設計模式筆記Filter
- 策略模式在應用中的實踐模式
- [譯] 設計 QA 在應用程式設計中的重要性程式設計
- 設計模式 | 策略模式及典型應用設計模式
- DFMEA在通訊產品設計中的應用