概念
简单理解,装饰模式就是不断给一个物品或者一件事进行动态装饰,在不改变其结构的前提下,使其添加功能。
实现
举例:当我们有了一台车之后,每隔一段时间都会回去4S店进行保养的,当车子在4S店做完保养后,4S店都会给我们打印一个清单,表示所有在4S店的服务。假如我们不只是做保养,还需要给车加个大尾翼和换个颜色,那么用普通方式如下:
首先定义一个4S店基本服务的抽象类:
public abstract class FourS {
//进行保养
public abstract void unkeep();
//向顾客罗列费用清单
public abstract void list();
}
再定义4S店基本服务的具体实现:
public class BaseService extends FourS {
//给车做保养
@Override
public void unkeep() {
System.out.println("进行保养");
}
//向顾客罗列费用清单
@Override
public void list() {
this.unkeep();
}
}
顾客说我不止是做保养,还需要加个尾翼,换个颜色
那就是4S店的特殊服务了:
public class SpecialService extends BaseService{
//给车换个颜色
private void color(){
System.out.println("给它换个颜色!");
}
//给车添加个装饰
private void add(){
System.out.println("给它添加个大尾翼!");
}
//因为保养是基本服务,所以无论添加任何其他服务都需要加入
@Override
public void list(){
//把加尾翼的费用加到清单中
this.add();
//把加颜色的费用加到清单中
this.color();
//把保养的费用加到清单中
super.unkeep();
}
}
给顾客查看清单:
public class Customer {
public static void main(String[] args) {
FourS car = new SpecialService();
//给顾客缠绵费用清单
car.list();
}
}
实验结果:
弊端:由此可见,通过继承实现装饰,不断添加,会导致类爆炸,类的数量激增,如果以后需要维护,不仅是工作量大,而且维护成本也很高。
装饰模式实现:
定义一个装饰的抽象类,用于封装4S店,代码如下:
public class Decorator extends FourS {
//声明一个4S店
private FourS fs;
//构造函数,传递这个4s店过来
public Decorator(FourS fs){
this.fs = fs;
}
//4S店基本服务保养还是得做的
public void unkeep(){
this.fs.unkeep();
}
//还是需要给客户罗列清单的
public void list(){
this.fs.list();
}
}
4S店实现一个更换颜色的服务:
public class ColorDecorator extends Decorator {
public ColorDecorator(FourS fs) {
super(fs);
}
//换个颜色
private void color(){
System.out.println("给车换个颜色!");
}
//给顾客罗列费用清单
@Override
public void list(){
super.list();
this.color();
}
}
4S店实现一个添加部件的服务:
public class AddDecorator extends Decorator {
//构造函数
public AddDecorator(FourS fs) {
super(fs);
}
//添加个大尾翼
private void add(){
System.out.println("添加个大尾翼!");
}
//重新打印清单
@Override
public void list(){
super.list();
this.add();
}
}
顾客查看清单时:
public class Customer {
public static void main(String[] args) {
//找到一个4S店
FourS fs;
//4s店的基本服务
fs = new BaseService();
//给车换个色
fs = new ColorDecorator(fs);
//给车加个尾翼
fs = new AddDecorator(fs);
//给顾客缠绵费用清单
fs.list();
}
}
装饰模式还有一个非常好的优点,扩展性非常好,在一个项目中,你会有非常多因素考虑不到,特别是业务的变更,总会有新的需求的出现,如果使用该模式会很简便就给项目进行添加了,十分容易维护。
本文代码:https://pan.baidu.com/s/1aQWRkDYfMaobZe5hpabVXQ
提取码:ub0r