首页 > 其他 > 详细

静态代理和动态代理

时间:2019-09-10 12:07:19      阅读:58      评论:0      收藏:0      [点我收藏+]

代理模式主要应用的场景是:当某些类由于一些原因不方便直接访问或者修改,需要通过一个代理类作为桥梁,来实现间接访问并扩展功能。

静态代理

假设我们有一个游戏模块,包含各种不同类型的游戏,我们需要在游戏开始和结束的时候加入时间提示,让我们看看利用静态代理怎么实现这个需求:

技术分享图片

上面的UML图定义了一个游戏接口(Game),格斗游戏类(FightingGame)和射击游戏类(ShootingGame)分别实现了该接口,代码如下:

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!