一个给咖啡添加配料的demo。
如果不使用装饰器模式,咖啡和配料高度耦合,每新增一个配料,都需要修改Coffee类,违反开闭原则。
package decorator;
public interface ICoffee {
void makeCoffee();
}
package decorator;
public class Coffee implements ICoffee{
@Override
public void makeCoffee() {
System.out.println("咖啡制作完毕");
}
}
package decorator;
public class Decorator implements ICoffee{
ICoffee iCoffee;
public Decorator(ICoffee iCoffee) {
super();
this.iCoffee = iCoffee;
}
@Override
public void makeCoffee() {
iCoffee.makeCoffee();
}
}
package decorator;
public class MilkDecorator extends Decorator{
public MilkDecorator(ICoffee iCoffee) {
super(iCoffee);
}
@Override
public void makeCoffee() {
iCoffee.makeCoffee();
System.out.println("加奶");
}
}
package decorator;
public class SugarDecorator extends Decorator{
public SugarDecorator(ICoffee iCoffee) {
super(iCoffee);
}
@Override
public void makeCoffee() {
iCoffee.makeCoffee();
System.out.println("加糖");
}
}
package decorator;
public class ColaDecorator extends Decorator{
public ColaDecorator(ICoffee iCoffee) {
super(iCoffee);
}
@Override
public void makeCoffee() {
iCoffee.makeCoffee();
System.out.println("加可乐");
}
}
package decorator;
public class DecoratorTest {
public static void main(String[] args) {
ColaDecorator colaDecorator=new ColaDecorator(
new MilkDecorator(
new SugarDecorator(
new Coffee()
)
)
);
colaDecorator.makeCoffee();
}
}
打印结果:
咖啡制作完毕
加糖
加奶
加可乐
小结:
1.代理模式与装饰器模式的区别:
代理模式更侧重于代理与被代理的关系,权限;
装饰器模式更侧重于原有类功能的扩展。