装饰者模式之我见

举个例子:

    对于一个蛋糕店,可以有奶油蛋糕、巧克力蛋糕、冰激凌蛋糕、带卡片的巧克力蛋糕、带花的奶油蛋糕等等。

    如果我们的设计是以蛋糕为基类,其他都是继承自这个基类,那么会写很多很多类,因为,用户可能想要带卡片的插花的冰激凌蛋糕等等。

这样的设计显然不好。

对于以上的情况,我们可以用设计者模式。

我们以蛋糕为基本食品类,其他的奶油、巧克力、卡片、花等都是装饰品,当用户想要何种装饰,只要往蛋糕上面加装饰品即可。

装饰者模式需要基本类和装饰类都实现同一个接口,以保证他们实现同样的方法。

因为对于面向对象编程来说,主要是方法,我们用程序来模拟现实世界中的事物,也是以方法的形式。

比如,对于蛋糕、奶油和巧克力等,都实现了“评论”这个方法。

共同实现的接口为:

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();
   }
}

这样,用户要什么类型的蛋糕,只要把相应的装饰品装饰上去就可以了。

posted on 2012-04-18 22:44  亭子  阅读(175)  评论(0编辑  收藏  举报

导航