java基础

设计模式(2)装饰器模式

2019-03-15  本文已影响0人  菜鸟上路咯
装饰模式是为了完成某些流程的拓展功能,将步骤(即算法)模块化 装饰模式.png

装饰模式实例
public class Decorator {
public static void main(String[] args) {
Food food1 = new DanChaofan();
Food food2 = new KaoRouFan();
food1 = new JiaJiTui(food1);
food1 = new JiaShaoFan(food1);
food2 = new JiaShaoFan(food2);
System.out.println(food1.name() + "--" + food1.price());
System.out.println(food2.name() + "--" + food2.price());
}
}
//通用接口
interface Food {
String name();

Double price();

}
//被装饰实现类 蛋炒饭
class DanChaofan implements Food {

public String name() {
    return "蛋炒饭";
}

public Double price() {
    return 15.00;
}

}
//被装饰实现类 烤肉饭
class KaoRouFan implements Food {

public String name() {
    return "烤肉饭";
}

public Double price() {
    return 18.00;
}

}
//抽象装饰类
abstract class JiaNiao implements Food {
Food food;

public JiaNiao(Food food) {
    this.food = food;
}

}
//具体装饰类 加个鸡腿
class JiaJiTui extends JiaNiao {

JiaJiTui(Food food) {
    super(food);
}

public String name() {
    return food.name() + " 加个鸡腿";
}

public Double price() {
    return food.price() + 5;
}

}
//具体装饰类 加份饭
class JiaShaoFan extends JiaNiao {

JiaShaoFan(Food food) {
    super(food);
}

public String name() {
    return food.name() + " 加份饭";
}

public Double price() {
    return food.price() + 2;
}

}

运行结果 装饰模式结果.PNG 其核心在于维护一个装饰的抽象类,通过构造注入顶级接口对象,然后在具体装饰逻辑封装于装饰类中,在使用的时候依次把装饰类组合构成一个装饰链来达成目的,其运作过程不涉及被装饰对象的结构改变。由此可见,装饰模式适合用于期望实现的业务基于重复流程的堆积,如果基于生成对应情形的穷举子类,无疑是不合时宜的,装饰模式只关心有多少可能的重复流程,并将其抽象为对应的装饰类即可。但是同样可见,如果设计的流程过细,整体的装饰链过长,在实现某一流程将会需要制作过多的半成品对象。

借用现代化的流水化生产线来类比,一条流水线是由多个不同的操作部门来组成的,比如一辆车,要经过上色,喷漆,烤漆一系列流程,当现在的流水线是生产红色的车,若要生产黑色的车,需要重新建一条流水线么,很显然,只用把上色操作部门切换成上黑色而已。或者说现在我想要在车上加个图案,同样的仅仅需要在流水线的合适位置加上对应的作画部门而已。所谓装饰模式就是避免了过多的新建流水线的一种策略。

上一篇下一篇

猜你喜欢

热点阅读