一、前言:
- 动态的将新功能附加到对象上。
- 相比继承,在功能扩展方面更具有弹性。
- 遵循 OCP (Open Closed Principle)原则。
二、UML图:
三、装饰者模式:
3.1、代码实例:
Step 1) 创建 Drink 抽象类:
public abstract class Drink {
public String des;
private float price = 0.0f;
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public abstract float cost();
}
Step 2) 创建 Coffee 类、及其 Expresso、LongBlack、ShortBlack、Decaf 实现类:
public class Coffee extends Drink{
@Override
public float cost() {
return super.getPrice();
}
}
class Expresso extends Coffee{
public Expresso(){
setDes("意大利咖啡");
setPrice(6.0f);
}
}
class LongBlack extends Coffee{
public LongBlack(){
setDes("LongBlack 咖啡");
setPrice(5.0f);
}
}
class ShortBlack extends Coffee{
public ShortBlack(){
setDes("ShortBlack 咖啡");
setPrice(4.0f);
}
}
class Decaf extends Coffee{
public Decaf(){
setDes("无因咖啡");
setPrice(1.0f);
}
}
Step 3) 创建 Decorartor 类、及其 Chocolate、Milk、Soy 实现类:
public class Decorartor extends Drink{
private Drink obj;
public Decorartor(Drink obj){
this.obj = obj;
}
@Override
public float cost() {
return (super.getPrice()+ obj.cost());
}
@Override
public String getDes() {
return ( "(" + obj.getDes() + " " + obj.getPrice() + ")" + " + " + "(" + super.des + " " + super.getPrice() + ")" );
}
}
class Chocolate extends Decorartor{
public Chocolate(Drink obj) {
super(obj);
setDes("巧克力");
setPrice(3.0f);
}
}
class Milk extends Decorartor{
public Milk(Drink obj) {
super(obj);
setDes("牛奶");
setPrice(2.0f);
}
}
class Soy extends Decorartor{
public Soy(Drink obj) {
super(obj);
setDes("豆浆");
setPrice(1.5f);
}
}
Step 4) 创建 main 方法:
public class CoffeeBar {
public static void main(String[] args) {
// Drink order = new LongBlack();
Drink order = new Decaf();
System.out.println("描述1:" + order.getDes() + " = " + order.cost());
order = new Milk(order);
System.out.println("加入一份牛奶 描述2:" + order.getDes() + " = " + order.cost());
order = new Chocolate(order);
System.out.println("加入一份牛奶 再加入一份巧克力 描述2:" + order.getDes() + " = " + order.cost());
order = new Chocolate(order);
System.out.println("加入一份牛奶 再加入一份巧克力 再加入一份巧克力 描述2:" + order.getDes() + " = " + order.cost());
}
}
• 由 ChiKong_Tam 写于 2020 年 10 月 18 日