装饰者模式之我见

举个例子:

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

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

这样的设计显然不好。

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

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

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

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

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

共同实现的接口为:

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

   }

}

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

你可能感兴趣的:(装饰者模式)