726 words
4 minutes
代理模式
代理模式也叫委托模式, 应用非常广泛. 其定义
Provide a surrogate or placehoder for another object to control access to it.(为其它对象提供一种代理以控制对这个对象的访问)
基本用法
抽象主题类
public interface Subject{
//定义一个方法
public void request();
}
###真实主题类
public class RealSubject implements Subject{
@Override
public void request(){
}
}
代理类
public class Proxy implements Subject{
private Subject subject = null;
public Proxy(){
this.subject=new Proxy();
}
public Proxy(Subject subject){
this.subject=subject;
}
public Proxy(Object... objects){
//todo
}
public void request(){
//todo
}
public void before(){
//todo
}
public void after(){
//todo
}
}
一个代理类可以代理多个被代理者, 而在使用时, 该代理类到底代理哪个真实类, 可以由场景类决定.
优点
- 职责清晰
- 高扩展性
- 智能化
代理分类
设计模式中的代理分为普通代理和强制代理.
普通代理
普通代理的要求便是: 客户端只能访问代理角色, 而不能访问真实角色. 可以通过代理角色传递真实角色所需要的参数.
public interface IGamePlayer {
public void login(String user, String password);
}
public class GamePlayer implements IGamePlayer {
private String name="";
public GamePlayer(IGamePlayer gamePlayer,String name)throws Exception{
if(gamePlayer==null){
throw new Exception("不能创建真实角色");
}else{
this.name=name;
}
}
@Override
public void login(String user, String password) {
System.out.println("登录名"+user+"的用户"+this.name+"登录成功!");
}
}
public class GamePlayerProxy implements IGamePlayer {
private IGamePlayer mIGamePlayer=null;
public GamePlayerProxy(String name){
try{
mIGamePlayer=new GamePlayer(this,name);
}catch(Exception e ){
e.printStackTrace();
}
}
@Override
public void login(String user, String password) {
this.mIGamePlayer.login(user,password);
}
}
客户类代码
public static void main(String[] args){
IGamePlayer proxy=new GamePlayerProxy("张三");
System.out.println("start time");
proxy.login("zhangsan","password");
System.out.println("end time");
}
强制代理
强制代理要求必须通过真实角色去寻找代理角色, 否则不能访问.
public interface IGamePlayer {
public void login(String user, String password);
//每个人都可以找到自己的代理
public IGamePlayer getProxy();
}
public class GamePlayer implements IGamePlayer {
private String name="";
//我的代理是谁
private IGamePlayer proxy=null;
public GamePlayer(String name){
this.name=name;
}
@Override
public void login(String user, String password) {
if(this.isProxy()){
System.out.println("登录名"+user+"的用户"+this.name+"登录成功!");
}else{
System.out.println("请使用指定的代理访问");
}
}
@Override
public IGamePlayer getProxy() {
this.proxy=new GamePlayerProxy(this);
return this.proxy;
}
private boolean isProxy(){
if(this.proxy==null){
return false;
}else{
return true;
}
}
}
public class GamePlayerProxy implements IGamePlayer {
private IGamePlayer gameplayer=null;
public GamePlayerProxy(IGamePlayer gamePlayer){
this.gameplayer=gamePlayer;
}
@Override
public void login(String user, String password) {
this.gameplayer.login(user,password);
}
@Override
public IGamePlayer getProxy() {
return this;
}
}
客户类代码
public class Client {
public static void main(String[] args){
IGamePlayer gameplayer=new GamePlayer("张三");
IGamePlayer proxy=gameplayer.getProxy();
System.out.println("start time");
proxy.login("zhangsan","password");
System.out.println("end time");
}
}
动态代理
public class GamePlayIH implements InvocationHandler{
//被代理者
Class cls=null;
//被代理的实例
Object obj=null;
public GamePlayIH(Object obj){
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=method.invoke(this.obj,args);
if(method.getName().equalsIgnoreCase("login")){
System.out.println("有人正在用我账号登录");
}
return result;
}
}
public class GamePlayer implements IGamePlayer {
private String name="";
public GamePlayer(String name){
this.name=name;
}
@Override
public void login(String user, String password) {
System.out.println("登录名"+user+"的用户"+this.name+"登录成功!");
}
}
客户类代码
public static void main(String[] args) throws Throwable{
IGamePlayer player=new GamePlayer("张三");
InvocationHandler handler=new GamePlayIH(player);
System.out.println("start time");
//获取类的ClassLoader
ClassLoader cl=player.getClass().getClassLoader();
//动态生产一个代理者
IGamePlayer proxy=(IGamePlayer) Proxy.newProxyInstance(cl,new Class[]{IGamePlayer.class},handler);
proxy.login("zhangsan","password");
System.out.println("end time ");
}