使用场景:一个类存在多个需要扩展的维度;不希望使用继承或因为继承导致类爆炸;在抽象层次建立一个关联关系。
与装饰者模式的差异:装饰者是对一个类不停套娃实现功能加强
public abstract class OperatingSystem { //聚合视频解码器 protected VideoResolver videoResolver; public OperatingSystem(VideoResolver videoResolver) { this.videoResolver = videoResolver; } //播放视频 public abstract void play(String fileName); }
public class Windows extends OperatingSystem { public Windows(VideoResolver videoResolver) { super(videoResolver); } @Override public void play(String fileName) { videoResolver.decode(fileName); } }
public class Mac extends OperatingSystem { public Mac(VideoResolver videoResolver) { super(videoResolver); } @Override public void play(String fileName) { videoResolver.decode(fileName); } }
public abstract class VideoResolver { //解码播放 public abstract void decode(String fileName); }
public class AVIResolver extends VideoResolver { @Override public void decode(String fileName) { if(fileName!=null&&fileName.toLowerCase().contains(".avi")) { System.out.println("正在播放:" + fileName.toLowerCase().replace(".avi","")); return; } System.out.println("无法解析"); } }
public class RMVBResolver extends VideoResolver { @Override public void decode(String fileName) { if(fileName!=null && fileName.toLowerCase().contains(".rmvb")){ System.out.println("正在播放:"+fileName.toLowerCase().replace(".rmvb","")); return; } System.out.println("无法解析"); } }
public class Client { public static void main(String[] args) { //创建视频解码器 VideoResolver videoResolver = new RMVBResolver(); //创建操作系统放入解码器 OperatingSystem windows = new Windows(videoResolver); //播放rmvb类型视频 windows.play("战狼.RMVB"); } }