代理模式主要应用的场景是:当某些类由于一些原因不方便直接访问或者修改,需要通过一个代理类作为桥梁,来实现间接访问并扩展功能。
假设我们有一个游戏模块,包含各种不同类型的游戏,我们需要在游戏开始和结束的时候加入时间提示,让我们看看利用静态代理怎么实现这个需求:
public interface Game {
public void playGame();
}
public class FightingGame implements Game {
public void playGame() {
System.out.println("FightingGame");
}
}
public class ShootingGame implements Game {
public void playGame() {
System.out.println("ShootingGame");
}
}
假如我们要在游戏开始前打印"Game Start",在游戏结束时打印"Game Over",为此我们定义一个代理类(GameProxy):
public class GameProxy implements Game {
private Game game;
public GameProxy(Game game) {
this.game = game;
}
public void playGame() {
if(game!=null) {
System.out.println("Game Start!");
game.playGame();
System.out.println("Game Over!");
}
}
}
新建一个测试类:
public class MyTestClass {
@Test
public void demo01() {
ShootingGame shootingGame = new ShootingGame();
Game game = new GameProxy(shootingGame);
game.playGame();
}
@Test
public void demo02() {
FightingGame fightingGame = new FightingGame();
Game game = new GameProxy(fightingGame);
game.playGame();
}
}
运行两个测试方法,将分别打印出:
Game Start!
FightingGame
Game Over!
Game Start!
ShootingGame
Game Over!
我们用另一个游戏场景来演示动态代理的使用(∩_∩)。
在LOL里有一个英雄是狂野女猎手(俗称豹女),她有人形和猎豹两种形态,每种形态下都有对应的技能,UML如图:
原文:https://www.cnblogs.com/CoderWayne/p/11496415.html