装饰者模式之我见
舉個例子:
? ? 對于一個蛋糕店,可以有奶油蛋糕、巧克力蛋糕、冰激凌蛋糕、帶卡片的巧克力蛋糕、帶花的奶油蛋糕等等。
? ? 如果我們的設計是以蛋糕為基類,其他都是繼承自這個基類,那么會寫很多很多類,因為,用戶可能想要帶卡片的插花的冰激凌蛋糕等等。
這樣的設計顯然不好。
對于以上的情況,我們可以用設計者模式。
我們以蛋糕為基本食品類,其他的奶油、巧克力、卡片、花等都是裝飾品,當用戶想要何種裝飾,只要往蛋糕上面加裝飾品即可。
裝飾者模式需要基本類和裝飾類都實現同一個接口,以保證他們實現同樣的方法。
因為對于面向對象編程來說,主要是方法,我們用程序來模擬現實世界中的事物,也是以方法的形式。
比如,對于蛋糕、奶油和巧克力等,都實現了“評論”這個方法。
共同實現的接口為:
public interface Comment {public void show(); }蛋糕類為:
public class Cake implements Comment {@Override
public void show() {System.out.println("Cake is good");} }
各個裝飾者可以抽象出一個基類,這個基類實現了共同接口:
public class Decorator implements Comment {private Comment comment;public Decorator(Comment comment) {this.comment = comment;}@Overridepublic void show() {comment.show();} }花朵裝飾者為:
public class FlowerDecorator extends Decorator {public FlowerDecorator(Comment comment) {super(comment);}@Overridepublic void show() {super.show();showSelf();}private void showSelf() {System.out.println("Flower is beautiful");} }巧克力裝飾者為:
public class ChocolateDecorator extends Decorator {public ChocolateDecorator(Comment comment) {super(comment);}@Overridepublic void show() {super.show();showSelf();}private void showSelf() {System.out.println("Chocolate is Delicious");} }那么,當有用戶要買插花的巧克力蛋糕時,我們可以這樣給他:
public class Client {public static void main(String[] args) {Comment comment = new ChocolateDecorator(new FlowerDecorator(new Cake()));comment.doSomething();} }這樣,用戶要什么類型的蛋糕,只要把相應的裝飾品裝飾上去就可以了。
轉載于:https://www.cnblogs.com/tingzi/archive/2012/04/18/2456112.html
總結
- 上一篇: 湖北地区的一些主要DNS服务器
- 下一篇: struts1 几种Action父类的比