1、问题描述
小明喜欢品尝不同口味的咖啡,他发现每种咖啡都可以加入不同的调料,比如牛奶、糖和巧克力。他决定使用装饰者模式制作自己喜欢的咖啡。
请设计一个简单的咖啡制作系统,使用装饰者模式为咖啡添加不同的调料。系统支持两种咖啡类型:黑咖啡(Black Coffee)和拿铁(Latte)。
输入描述
多行输入,每行包含两个数字。第一个数字表示咖啡的选择(1 表示黑咖啡,2 表示拿铁),第二个数字表示要添加的调料类型(1 表示牛奶,2 表示糖)。
输入示例
1 1
2 2
输出示例
Brewing Black Coffee
Adding Milk
Brewing Latte
Adding Sugar
2、装饰者模式
装饰模式可以在不定义⼦类的情况下动态的给对象添加⼀些额外的功能。具体的做法是装饰类包含原始对象的引用,为原始对象动态添加新的⾏为,⽽⽆需修改其代码
3、代码
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
for(int i=0;sc.hasNextInt();i++){
int t=sc.nextInt();
int add=sc.nextInt();
if(t==1){
Coffee c=new BlackCoffee();
ConcreteDecorate cD=new ConcreteDecorate(c);
cD.display(add);
}else if(t==2){
Coffee c=new Latte();
ConcreteDecorate cD=new ConcreteDecorate(c);
cD.display(add);
}
}
}
}
interface Coffee{
void display(int tag);
}
class BlackCoffee implements Coffee{
@Override
public void display(int tag) {
System.out.println("Brewing Black Coffee");
}
}
class Latte implements Coffee{
@Override
public void display(int tag) {
System.out.println("Brewing Latte");
}
}
abstract class Decorate implements Coffee{
private Coffee coffee;
public Decorate(Coffee c){
this.coffee=c;
}
@Override
public void display(int tag) {
coffee.display(tag);
}
}
class ConcreteDecorate extends Decorate{
public ConcreteDecorate(Coffee c) {
super(c);
}
@Override
public void display(int tag) {
super.display(tag);
if (tag==2){
System.out.println("Adding Sugar");
}else if(tag==1){
System.out.println("Adding Milk");
}
}
}