装饰者模式之我见
举个例子:
对于一个蛋糕店,可以有奶油蛋糕、巧克力蛋糕、冰激凌蛋糕、带卡片的巧克力蛋糕、带花的奶油蛋糕等等。
如果我们的设计是以蛋糕为基类,其他都是继承自这个基类,那么会写很多很多类,因为,用户可能想要带卡片的插花的冰激凌蛋糕等等。
这样的设计显然不好。
对于以上的情况,我们可以用设计者模式。
我们以蛋糕为基本食品类,其他的奶油、巧克力、卡片、花等都是装饰品,当用户想要何种装饰,只要往蛋糕上面加装饰品即可。
装饰者模式需要基本类和装饰类都实现同一个接口,以保证他们实现同样的方法。
因为对于面向对象编程来说,主要是方法,我们用程序来模拟现实世界中的事物,也是以方法的形式。
比如,对于蛋糕、奶油和巧克力等,都实现了“评论”这个方法。
共同实现的接口为:
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; } @Override public void show() { comment.show(); } }
花朵装饰者为:
public class FlowerDecorator extends Decorator { public FlowerDecorator(Comment comment) { super(comment); } @Override public 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); } @Override public 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(); } }
这样,用户要什么类型的蛋糕,只要把相应的装饰品装饰上去就可以了。