《设计模式之代理模式》

1.代理模式的定义

代理模式的英文定义:
Provide a surroagte or placehloder for another object to control access to it.
大体的意思就是:为其他对象提供一种代理以控制对这个对象的访问。
代理模式是一项基本的设计技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上也是采用了代理模式。代理模式的类图如下:
这里写图片描述
代理模式提供了三个角色。
1)抽象主题角色:该角色是真实主题和代理主题的共同接口,以便在任何时候可以使用真实主题的第放都可使用代理主题。
2)代理主题角色:也叫委托类、代理类,该角色负责控制真实主题的引用,负责在需要的时候创建和删除真实主题的对象,并在真实主题角色处理完毕前后做预处理和后处理工作。
3)真实主题角色:该角色也叫被委托角色,或者被代理角色,是业务逻辑的具体执行者。
Subject.java

    import java.util.*;

    /**
     * 
     */
    public interface Subject {

        /**
         * 
         */
        public void request();

    }

RealSubject.java

    import java.util.*;

    /**
     * 
     */
    public class RealSubject implements Subject {

        /**
         * Default constructor
         */
        public RealSubject() {
        }

        /**
         * 
         */
        public void request() {
            // TODO implement here
            //***业务逻辑***
        }
    }

ProxySubject.java

    import java.util.*;

    /**
     * 
     */
    public class ProxySubject implements Subject {

        private Subject subject;
        /**
         * Default constructor
         */
        public ProxySubject(Subject subject) {
            this.subject= subject;
        }

        /**
         * 
         */
        public void beforeRequest() {
            // TODO implement here
        }

        /**
         * 
         */
        public void afterRequest() {
            // TODO implement here
        }

        /**
         * 
         */
        public void request() {
            // TODO implement here
            beforeRequest();
            subject.request();
            afterRequest();
        }
    }
一个代理类可以代理多个真实主题,具体代理那个真实的主题是由高层的应用模块决定的,可以通过代理类的构造函数传递内代理者。

2.代理模式的优点

代理模式的优点有以下几个方面:
1)职责清晰:真实的角色实现实现的业务逻辑,不用关心其他非本职的事务,通过后期的代理完成附件的事务,附带的结果就是编程简洁清晰。
2)高度展性:具体主题角色随需求不同可能变为多种,但是只要实现了接口,代理类就可以完全在不做任何修饰的情况下代理各种真实的角色。
3)智能化:代理类可以再运行的时候确定真实的代理主题,这是一种强大的功能。

3.代理模式的实例

下述代码用于实现任务描述,通过游戏代练演示代理模式的应用,其类图如下:
这里写图片描述

IGamePlayer.java

    package fengqi.wang;

    public interface IGamePlayer {
        public void killBoss();

        public void upGrade();
    }

GamePlayer.java

    package fengqi.wang;

    public class GamePlayer implements IGamePlayer {

        private String name = "";

        GamePlayer(String name) {
            this.name = name;
        }

        @Override
        public void killBoss() {
            // TODO Auto-generated method stub
            System.out.println(this.name + "正在打怪。");
        }

        @Override
        public void upGrade() {
            // TODO Auto-generated method stub
            System.out.println(this.name + "成功升了1级。");
        }

    }

GamePlayerProxy.java

    package fengqi.wang;

    import java.util.Date;

    public class GamePlayerProxy implements IGamePlayer {

        private IGamePlayer player = null;

        public GamePlayerProxy(IGamePlayer player) {
            // TODO Auto-generated constructor stub
            this.player = player;
        }

        private void log() {
            System.out.println("打怪时间 " + new Date().toString());
        }

        private void count() {
            System.out.println("升1级消耗了10小时");
        }

        @Override
        public void killBoss() {
            // TODO Auto-generated method stub
            log();
            player.killBoss();
        }

        @Override
        public void upGrade() {
            // TODO Auto-generated method stub
            player.upGrade();
            count();
        }

    }

TestGamePlayerProxy.java

    package fengqi.wang;

    public class TestGamePlayerProxy {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            IGamePlayer player = new GamePlayer("张三丰");
            IGamePlayer proxy = new GamePlayerProxy(player);

            proxy.killBoss();
            proxy.upGrade();

        }

    }

测试结果

打怪时间 Wed Aug 10 15:56:30 CST 2016
张三丰正在打怪。
张三丰成功升了1级。
升1级消耗了10小时
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值