这两种模式很相识,在面试时候也经常会拿出来一起做比较,所以这里放在一起记录一下。
静态代理
意图:为其他对象提供一种代理以控制对这个对象的访问。
代码实现
建一个接口
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();
}
}
装饰器模式和代理模式代码很相似,主要不同点,传入具体实现类的方式

代理模式是在扩展类中直接创建,是采用组合的方式;装饰器模式是采用构造方法传参赋值,是采用聚合的方式。也就是说代理模式是在编译时就已经只要将要操作的对象,而装饰器模式只有到了运行阶段才能确定。另一方面代理模式直接创建对象,对外隐藏了具体的实现,而装饰器模式需要使用者自己去创建具体的实现类。
本文详细对比了代理模式和装饰器模式,探讨了两者在控制对象访问和动态增加职责方面的应用。代理模式通过组合方式创建代理对象,而装饰器模式通过聚合方式在运行时动态增强对象功能。

783

被折叠的 条评论
为什么被折叠?



