这两种模式很相识,在面试时候也经常会拿出来一起做比较,所以这里放在一起记录一下。
静态代理
意图:为其他对象提供一种代理以控制对这个对象的访问。
代码实现
建一个接口
public interface IPlayer {
/**
* 打游戏
*/
void play();
}
真实实现类
public class GamePlayer implements IPlayer {
@Override
public void play() {
System.out.println("玩游戏中...");
}
}
代理类
public class GamePlayerProxy implements IPlayer {
private IPlayer iPlayer;
GamePlayerProxy(){
iPlayer = new GamePlayer();
}
@Override
public void play() {
System.out.println("玩游戏之前的动作...");
iPlayer.play();
System.out.println("玩游戏之后的动作...");
}
}
运行
public class ClientDemo {
public static void main(String[] args) {
GamePlayerProxy gamePlayerProxy = new GamePlayerProxy();
gamePlayerProxy.play();
}
}
装饰器模式
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
建一个接口
public interface IPlayer {
/**
* 打游戏
*/
void play();
}
具体实现类
public class GamePlayer implements IPlayer {
@Override
public void play() {
System.out.println("玩游戏中...");
}
}
装饰类
public class GamePlayerDecorator implements IPlayer {
private IPlayer iPlayer;
GamePlayerDecorator(IPlayer iPlayer) {
this.iPlayer = iPlayer;
}
@Override
public void play() {
System.out.println("玩游戏之前的动作...");
iPlayer.play();
System.out.println("玩游戏之后的动作...");
}
}
运行
public class ClientDemo {
public static void main(String[] args) {
GamePlayerDecorator gamePlayerDecorator = new GamePlayerDecorator(new GamePlayer());
gamePlayerDecorator.play();
}
}
装饰器模式和代理模式代码很相似,主要不同点,传入具体实现类的方式
代理模式是在扩展类中直接创建,是采用组合的方式;装饰器模式是采用构造方法传参赋值,是采用聚合的方式。也就是说代理模式是在编译时就已经只要将要操作的对象,而装饰器模式只有到了运行阶段才能确定。另一方面代理模式直接创建对象,对外隐藏了具体的实现,而装饰器模式需要使用者自己去创建具体的实现类。