装饰器模式
我们先定义一个看电影的接口
public interface IWatchFilm {
void watchFilm();
}
然后是实现类,在豪华影院观看电影
public class HaoHuaFilm implements IWatchFilm{
@Override
public void watchFilm() {
System.out.println("在豪华影院观看电影...");
}
}
现在,我不仅想要看电影,还想要吃零食,也就是在原来的功能上做增强,一种办法是直接加在watchFilm的代码中,但是这样就会对原来的代码造成侵入,这时候我们就可以用到装饰器模式了,同样需要实现一开始的看电影接口,但是看电影的实现类可以作为参数通过构造函数传递,这样就可以在装饰器中使用原来的功能,并且补充新的功能
public class FoodDecorator implements IWatchFilm {
private IWatchFilm watchFilm;
public FoodDecorator(IWatchFilm watchFilm) {
this.watchFilm = watchFilm;
}
@Override
public void watchFilm() {
System.out.println("观看电影时,还可以享受美食...");
watchFilm.watchFilm();
}
}
运行代码:
public class Main {
public static void main(String[] args) {
IWatchFilm watchFilm = new HaoHuaFilm();
FoodDecorator foodDecorator = new FoodDecorator(watchFilm);
foodDecorator.watchFilm();
}
}
运行结果:
观看电影时,还可以享受美食...
在豪华影院观看电影...
在此基础上, 我们还可以接着装饰:
public class GirlFriendDecorator extends FoodDecorator {
public GirlFriendDecorator(IWatchFilm watchFilm) {
super(watchFilm);
}
@Override
public void watchFilm() {
System.out.println("观看电影时,还可以和女朋友一起...");
super.watchFilm();
}
}
public static void main(String[] args) {
IWatchFilm watchFilm = new HaoHuaFilm();
FoodDecorator foodDecorator = new FoodDecorator(watchFilm);
GirlFriendDecorator girlFriendDecorator = new GirlFriendDecorator(foodDecorator);
girlFriendDecorator.watchFilm();
}
运行结果:
观看电影时,还可以和女朋友一起...
观看电影时,还可以享受美食...
观看电影时,还可以享受美食...
在豪华影院观看电影...