`
TRAMP_ZZY
  • 浏览: 140004 次
社区版块
存档分类
最新评论

设计模式-代理模式

 
阅读更多
Provide a surrogate or placeholder for another object to control access to it.
	为其他对象提供一种代理以控制对这个对象的访问。
	
	public interface Subject {

		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) {
			
		}
		
		@Override
		public void request() {
			
			this.before();
			this.subject.request();
			this.after();
		}

		private void before() {
			
		}
		
		private void after() {
			
		}
	}
	
	代理模式的优点
	(1)职责清晰
	(2)高扩展性
	(3)智能化
	
	代理模式的扩展
	(1)普通代理
	public class GamePlayer implements IGamePlayer {

		private String name = "";
		
		public GamePlayer(IGamePlayer gamePlayer, String name) throws Exception {
			if (gamePlayer == null) {
				throw new Exception("can not create real role.");
			} else {
				this.name = name;
			}
		}
		
		@Override
		public void login(String user, String password) {
			System.out.println("login name: " + user + " passwod: " + password);
		}

		@Override
		public void killBoss() {
			System.out.println(this.name + " killBoss");
		}

		@Override
		public void upgrade() {
			System.out.println(this.name + " upgrade");
		}

	}
	
	public class GamePlayerProxy implements IGamePlayer {

		private IGamePlayer gamePlayer = null;
		
		public GamePlayerProxy(String name) {
			try {
				gamePlayer = new GamePlayer(this, name);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		@Override
		public void login(String user, String password) {
			System.out.println("login name: " + user + " passwod: " + password);
		}

		@Override
		public void killBoss() {
			this.gamePlayer.killBoss();
		}

		@Override
		public void upgrade() {
			this.gamePlayer.upgrade();
		}

	}
	
	在普通的代理模式下,调用者只知道代理而不用知道真实的角色是谁,屏蔽了真实角色的变更对高层模块的影响。
	真实的主题角色想怎么修改就怎么修改,对高层次的模块没有任何的影响,只要你实现了接口所对应的方法。
	
	(2)强制代理
	强制代理要求必须通过真实的角色找到代理角色,否则你不能访问。
	public interface IGamePlayer {
	
		public void login(String name, String password);
		
		public void killBoss();
		
		public void upgrade();
		
		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("login name: " + user + " passwod: " + password);
			} else {
				System.out.println("use the assigned proxy.");
			}
		}

		@Override
		public void killBoss() {
			if (this.isProxy()) {
				System.out.println(this.name + " killBoss");
			} else {
				System.out.println("use the assigned proxy.");
			}
		}

		@Override
		public void upgrade() {
			if (this.isProxy()) {
				System.out.println(this.name + " upgrade");
			} else {
				System.out.println("use the assigned proxy.");
			}
		}

		@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 name, String password) {
			this.gamePlayer.login(name, password);
		}

		@Override
		public void killBoss() {
			this.gamePlayer.killBoss();
		}

		@Override
		public void upgrade() {
			this.gamePlayer.upgrade();
		}

		@Override
		public IGamePlayer getProxy() {
			return this;
		}

	}	
	
	public class Client {

		public static void main(String[] args) {
			
			IGamePlayer gamePlayer = new GamePlayer("zhangsan");
			IGamePlayer proxy = gamePlayer.getProxy();
			
			proxy.login("zhangsan", "2q3");
			proxy.killBoss();
			proxy.upgrade();
		}
	}
			
	(3)代理是有个性的
		一个类可以实现多个接口,完成不同任务的整合。也就是说代理类不仅可以实现主题接口,也可以实现其他
		接口,完成不同的任务,而且代理的目的是在目标对象方法的基础上作增强,这种增强的本质通常就是对目
		标对象的方法进行拦截和过滤。
		
	public interface IProxy {

		public void count();
	}
	
	public class GamePlayerProxy implements IGamePlayer, IProxy {

		private IGamePlayer gamePlayer = null;
		
		public GamePlayerProxy(IGamePlayer gamePlayer) {
			this.gamePlayer = gamePlayer;
		}
		
		@Override
		public void count() {
			System.out.println("upgrade cost 50 ruan.");
		}

		@Override
		public void login(String user, String password) {
			this.gamePlayer.login(user, password);
		}

		@Override
		public void killBoss() {
			this.gamePlayer.killBoss();
		}

		@Override
		public void upgrade() {
			this.gamePlayer.upgrade();
			this.count();
		}

	}
		
		代理类不仅仅是可以有自己的运算方法,通常的情况下代理的职责并不一定单一,它可以组合其他的
		真实角色,也可以实现自己的职责。代理类可以为真实角色预处理消息、过滤消息、转发消息、事后
		处理消息等。
		
		(4)动态代理
		一个类的动态代理是这样的一个类,由InvocationHandler 的实现类实现所有的方法,由其invoke方
		法接管所有方法的实现。动态代理的主要问题是解决我们通常说的“审计”问题,也就是横切面编程。
		在不改变我们已有的代码结构的情况下增强或控制对象的行为。
	public interface IGamePlayer {
	
		public void login(String user, String password);
		
		public void killBoss();
		
		public void upgrade();

	}
	
	public class GamePlayIH implements InvocationHandler {
	
		Class cls = null;
		Object obj = null;
		
		public GamePlayIH(Object object) {
			this.obj = object;
		}

		@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("my id has been used...");
			}
			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("login name: " + user + " passwod: " + password);
		}

		@Override
		public void killBoss() {
			System.out.println(this.name + " killBoss");
		}

		@Override
		public void upgrade() {
			System.out.println(this.name + " upgrade");
		}

	}
			
	public class Client {

		public static void main(String[] args) {
			
			IGamePlayer player = new GamePlayer("zhangsan");
			InvocationHandler handler = new GamePlayIH(player);
			
			ClassLoader cl = player.getClass().getClassLoader();
			// 动态产生一个代理者
			IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance(cl, new Class[]{IGamePlayer.class}, handler);
			
			proxy.login("zhangsan", "2233");
			proxy.killBoss();
			proxy.upgrade();
			
		}

	}
分享到:
评论

相关推荐

    Java设计模式-代理模式例子

    在这个“Java设计模式-代理模式例子”中,我们将深入探讨代理模式的概念、实现方式以及它在实际开发中的应用。 代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象控制对原对象的访问。在...

    设计模式-代理模式(讲解及其实现代码)

    设计模式-代理模式(讲解及其实现代码)

    java常用设计模式-代理模式

    Java 设计模式 - 代理模式 代理模式(Proxy Pattern)是一种常用的设计模式,提供了间接访问目标对象的一种方式,即通过代理对象访问目标对象。这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加...

    Java设计模式-代理模式

    代理模式是这些设计模式中的一种,它为其他对象提供一种代理以控制对这个对象的访问。代理模式的核心思想是在目标对象和客户端之间插入一个代理对象,代理对象可以扩展目标对象的功能,同时也能控制对目标对象的访问...

    基于Java的设计模式-代理模式demo的实现(高分课设)

    基于Java的设计模式——代理模式demo的实现(高分课设)个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用...

    JAVA-设计模式-结构型模式-代理模式

    JAVA-设计模式-结构型模式-代理模式

    设计模式--代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要角色,允许我们通过一个代理类来控制对原对象的访问。在《设计模式:可复用面向对象软件的基础》(通常称为GoF设计模式)中,代理模式被定义为“为其他对象...

    java设计模式-代理模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

    c++设计模式-结构型模式-代理模式

    代理模式是一种在面向对象设计中广泛应用的结构型设计模式,它提供了一种对目标对象进行间接访问的方式,使得客户端可以通过代理对象与真实对象进行交互,而无需直接接触真实对象。这样做的好处包括增加灵活性、控制...

    设计模式-Java语言中的应用

    通过阅读《设计模式-Java语言中的应用》,读者不仅可以掌握设计模式的基本概念和原理,还能学习到如何在实际项目中选择合适的设计模式,以及如何优雅地在Java代码中实现这些模式。这将有助于提升开发者的编程技巧,...

    C++设计模式-基于QT4开源跨平台开发框架 源码

    设计模式分为三大类:创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如代理、装饰器、适配器)和行为型模式(如观察者、策略、命令)。这些模式都是在特定上下文中解决设计问题的模板,它们可以提高代码的...

    java设计模式---诙谐易懂版

    例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 - 外观模式(Facade):提供一个统一的接口,用来访问子系统的一组接口。 - 适配器模式(Adapter):使两个接口不兼容的类能够协同工作。 ...

    Java设计模式----通俗易懂版

    这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...

    软件设计模式--填空题+简答题(复习7).rar

    2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...

    设计模式课件大全

    设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略...

    JAVA设计模式--程序设计--反射--注解--泛型

    设计模式包括创建型模式(如单例、工厂方法、抽象工厂等)、结构型模式(如适配器、装饰器、代理等)和行为型模式(如策略、观察者、职责链等)。这些模式提供了良好的可复用性和可扩展性,帮助开发者遵循“开闭原则...

    JAVA设计模式-chm版

    这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的解决方案的标准化描述,它们在软件工程中起到了重要的作用,帮助开发者创建可维护、可扩展且易于理解...

Global site tag (gtag.js) - Google Analytics