Java23种设计模式(六)装饰者设计模式

这是本人学习Java23种设计模式期间总结和记录,主要听的课程是尚硅谷——韩顺平老师的课程,这个课程可谓是非常详细了,推荐学习。

这里讲到装饰者设计模式,装饰者模式在新手初学的时候总觉得和桥接模式没啥区别,甚至称他们两为相同的模式,但是仔细理解以后,他们两个还是有着本质上的区别,首先他们作用方面都是一样的,都是将同一个东西的两个共同组成属性抽出来,然后需要新添加东西的时候只需添加对应的属性就行了。

但是桥接模式对应的是很严格的匹对,某样东西对应某种属性,某些东西对应不了这个属性。就用手机举例,很多手机品牌都对应着刘海屏的属性,很多品牌都对应的是安卓系统;但是,苹果手机虽然对应着刘海屏,但是对应的不是安卓系统,其他手机品牌也无法对应苹果系统,这样就不是桥接模式了,因为你不能随心所欲的添加属性或者其他,因为有着严格对应关系,而装饰者模式就不一样了,比如一份饮料,他什么配料都可以加,可以加珍珠,可以加糖,不论你是添加配料也好,还是添加新的饮料也好,他们都可以组合在一起,装视起来。举例咖啡饮品,代码如下:

@Setter
@Getter
public abstract class Drink {//不论是咖啡还是配料,最终搭配好的都是饮品
    public String des;

    private float price;

    public abstract float cost();
}

public class Coffee extends Drink {//咖啡的对象
    @Override
    public float cost() {
        return super.getPrice();
    }
}

public class Decorator extends Drink{//配料的对象

    private Drink drink;

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

    @Override
    public float cost() {
        return this.getPrice() + drink.cost();
    }

    @Override
    public String getDes(){
        return this.des + " " + this.getPrice() + "&&" + drink.getDes();
    }
}

public class Latte extends Coffee{//具体的拿铁咖啡

    public Latte() {
        setDes("拿铁咖啡");
        setPrice(20.0f);
    }
}

public class Milk extends Decorator {//具体的牛奶配料

    public Milk(Drink drink) {
        super(drink);
        setDes("加牛奶");
        setPrice(2.0f);
    }
}

public class CoffeeBar {//制作咖啡,将任意的配料加入咖啡
    public static void main(String[] args) {
        Drink latte = new Latte();
        System.out.println(latte.getDes() + latte.getPrice());
        latte = new Milk(latte);
        System.out.println(latte.getDes() + latte.cost());
        latte = new Milk(latte);
        System.out.println(latte.getDes() + latte.cost() );
    }
}

 

装饰者模式定义

  1. 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)
  2. 这里提到的动态的将新功能附加到对象和 ocp 原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。

装饰设计模式咖啡例子示意图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值