Featured image of post Java设计模式-装饰者模式Decorator

Java设计模式-装饰者模式Decorator

相关文章

【合集】Java设计模式

装饰者模式

其实就是继承抽象构件,又组合了一个抽象构件

抽象构件-饮品

1
2
3
4
5
6
7
@Getter
@AllArgsConstructor
public abstract static class Drink {
    private String des;
    private float price;
    public abstract float cost();
}

抽象构件-饮品(继承饮品)

1
2
3
4
5
6
7
8
9
public static class Coffee extends Drink {
    public Coffee(String des, float price) {
        super(des, price);
    }
    @Override
    public float cost() {
        return super.price;
    }
}

具体构件-美式咖啡

1
2
3
4
5
public static class LongBlack extends Coffee {
    public LongBlack() {
        super("longBlack", 5.0f);
    }
}

具体构件-意大利咖啡

1
2
3
4
5
public static class Espresso extends Coffee {
    public Espresso() {
        super("意大利咖啡", 6.0f);
    }
}

装饰抽象类

其实就是继承抽象构件,又组合了一个抽象构件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public static class Decorator extends Drink {
    private final Drink obj;
    public Decorator(Drink obj, String des, float price) {
        super(des, price);
        this.obj = obj;
    }
    @Override
    public float cost() {
        return super.price + obj.cost();
    }
    @Override
    public String getDes() {
        return super.des + obj.getDes();
    }
}

具体装饰类-巧克力

1
2
3
4
5
public static class Chocolate extends Decorator {
    public Chocolate(Drink obj) {
        super(obj, "巧克力", 3.0f);
    }
}

具体装饰类-牛奶

1
2
3
4
5
public static class Milk extends Decorator {
    public Milk(Drink obj) {
        super(obj, "牛奶", 2.0f);
    }
}

具体装饰类-豆浆

1
2
3
4
5
public static class Soy extends Decorator {
    public Soy(Drink obj) {
        super(obj, "豆浆", 1.5f);
    }
}

客户端调用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Drink order = new LongBlack();

order = new Milk(order);
System.out.println(order.getDes() + " " + order.cost() + "元");

order = new Chocolate(order);
System.out.println(order.getDes() + " " + order.cost() + "元");

order = new Chocolate(order);
System.out.println(order.getDes() + " " + order.cost() + "元");

System.out.println("===========================");

Drink order2 = new Soy(order);
System.out.println(order2.getDes() + " " + order2.cost() + "元");

order2 = new Milk(order2);
System.out.println(order2.getDes() + " " + order2.cost() + "元");

输出

1
2
3
4
5
6
牛奶longBlack 7.0元
巧克力牛奶longBlack 10.0元
巧克力巧克力牛奶longBlack 13.0元
===========================
豆浆巧克力巧克力牛奶longBlack 14.5元
牛奶豆浆巧克力巧克力牛奶longBlack 16.5元

应用

1
2
3
4
应用{@link java.io.FilterInputStream}装饰角色就是继承了InputStream, 并且组合了InputStream, {@link java.io.BufferedInputStream}则是具体装饰角色
应用{@link java.io.InputStreamReader}装饰角色就是继承了Reader, 并且组合了StreamDecoder{@link java.io.FileReader}则是具体装饰角色
应用{@link java.io.BufferedReader}装饰角色就是继承了Reader, 并且组合了Reader
应用{@link java.io.OutputStreamWriter}装饰角色就是继承了Writer, 并且组合了StreamEncoder{@link java.io.FileWriter}则是具体装饰角色

文件输入流

装饰角色:java.io.FilterInputStream

被装饰的接口:InputStream

皖ICP备2024056275号-1
发表了78篇文章 · 总计149.56k字
本站已稳定运行