前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >装饰者模式

装饰者模式

作者头像
提莫队长
发布2019-02-21 13:41:40
3420
发布2019-02-21 13:41:40
举报
文章被收录于专栏:刘晓杰刘晓杰

假设我们需要买一杯奶茶,计算总共花了多少钱,这个比较容易,一个class一个getPrice就行。那如果我要买一杯珍珠奶茶呢?再new一个?如果还有珍珠果肉奶茶?再new一个?显然不科学,所以我们需要装饰者模式

装饰者模式定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。

设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。

要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

这次我们要来将买一个带有milk和suger的一杯drink 先定义一个接口

public interface Drink {
    public double getPrice();
}

在定义一个买家(注意,继承的目的是继承类型,而不是行为,所以这里显得怪怪的)

public class Buyer implements Drink {
    private Drink drink;

    public Buyer(Drink drink) {
        this.drink = drink;
    }

    @Override
    public double getPrice() {
        return drink.getPrice();
    }

}

接下来就是各个装饰类了 给drink加糖,设定多2元

public class Suger implements Drink {
    private Drink drink;

    public Suger(Drink drink) {
        this.drink = drink;
    }

    @Override
    public double getPrice() {
        return drink.getPrice() + 2;
    }

}

给drink加奶,设定多1元

public class Milk implements Drink {
    private Drink drink;

    public Milk(Drink drink) {
        this.drink = drink;
    }

    @Override
    public double getPrice() {
        return drink.getPrice() + 1;
    }

}

测试函数

public class MyTest {

    public static void main(String[] args) {
        Buyer buyer = new Buyer(new Milk(new Suger(new Drink() {

            @Override
            public double getPrice() {
                // TODO Auto-generated method stub
                return 10;
            }
        })));

        System.out.println(buyer.getPrice());
        //******************显示13
    }

}

网上的其他例子都是通过一个类继承Drink,然后通过继承这个类来实现Suger和Milk的,我是直接实现了drink的

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年02月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档