`
liulanghan110
  • 浏览: 1077943 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

代理模式的运用

 
阅读更多

考虑这样一种情况。某个系统要根据用户的权限来判断是否能操作。那么可以这么写:

class ViewAction{
	String permission;
	public ViewAction(String permission ){
		this.permission = permission;
	}
	
	public void DoAction(){
		if(permission.equals("VIEW")){
			System.out.println("查看信息!");
		}
	}
}

class AddAction{
	String permission;
	public AddAction(String permission ){
		this.permission = permission;
	}
	
	public void DoAction(){
		if(permission.equals("ADD")){
			System.out.println("添加信息!");
		}
	}
}

public class proxy {
	public static void main(String[] args){
		//赋予用户查看权限
		String permission = "VIEW";
		ViewAction user = new ViewAction(permission);
		user.DoAction();
		AddAction user1 = new AddAction(permission);
		user1.DoAction();
	  }
}

 可以看到,虽然执行了添加 查看操作,可是最后只执行了查看操作。

 

但是这样子将权限和操作放在一起,违反了类的单一性原则。不利用程序维护。

 

既然有这么多的问题,我们有必要对该类进行重新设计。其实大家早已想到,这个类应该使用代理模式。和我们买火车票的动作一样,动作类不能直接执行那个动作,而是要先检查权限,然后才能执行;先检查权限,后执行的那各类其实就是一个代理类,修改后的代码如下:

 

interface Action{
	public void DoAction();
}

class ViewAction implements Action{
	public void DoAction(){
		System.out.println("查看信息!");
	}
}

class AddAction implements Action{
	public void DoAction(){
		System.out.println("添加信息!");
	}
}

class ProxyViewAction implements Action {
	private Action action = null;
	private User user = new User() ;
	public ProxyViewAction(Action act) {
		action = act;
	}

	public void DoAction() {
		// 调用权限类的方法取得用户权限
		if (user.getPermission().equals("VIEW")) {
			action.DoAction();
		}
	}
}

//用户信息
class User{
	private String permission = "VIEW" ;

	public String getPermission() {
		return permission;
	}

	public void setPermission(String permission) {
		this.permission = permission;
	}
}

public class proxy {
	public static void main(String[] args){
		ProxyViewAction proxy = new ProxyViewAction(new ViewAction());
		proxy.DoAction();
		//将用户信息的权限变成ADD,则上面的方法不能执行。
	  }
}

 在我们的ProxyViewAction类中,除了做了客户真正想要做的动作:DoAction()以外,还进行了额外的动作检查用户的权限。而作核心动 作DoAction()是在一个干干净净的类:ViewAction中进行,这个类只做核心动作,对其他的不关心,满足了单一职责原则。

 

客户端通过调用代理类来执行动作,而代理类一是将权限判断和动作的执行分离开来,满足了单一职责原则

 

代理又被称为委派,说的是代理类并不真正的执行那个核心动作,而是委派给另外一个类去执行,如ProxyView类中,ProxyView类并没有真正执行doAction()方法,而是交给ViewAction类去执行。

 

我们再来看代理类ProxyViewAction,可以看到它不仅依赖于接口Action,而且依赖于具体的实现ViewAction。这样对我们的系统 扩展很不利,比如我们有Add动作、Delete动作、Modify动作等等,我们需要对每一个动作都写一个代理类,而这些代理类都做同样的事情,先进行 权限判断,然后再委派。所以我们需要对这些代理再进行一次抽象,让它只依赖接口Action,而不依赖于具体的实现。    要实现这样的想法,我们需要将代理类中的具体实现提走,让代理的使用者在运行期提供具体的实现类,即所谓的依赖注入,代码如下

interface Action{
	public void DoAction();
}

class ViewAction implements Action{
	public void DoAction(){
		System.out.println("查看信息!");
	}
}

class AddAction implements Action{
	public void DoAction(){
		System.out.println("添加信息!");
	}
}

class ProxyAction implements Action {
	private Action action = null;
	private User user = new User() ;
	public ProxyAction(Action act) {
		action = act;
	}

	public void DoAction() {
		// 调用权限类的方法取得用户权限
		if (user.getPermission().equals(action.getClass().getSimpleName())) {
			action.DoAction();
		}
	}
}

//用户信息
class User{
	private String permission = "ViewAction" ;

	public String getPermission() {
		return permission;
	}

	public void setPermission(String permission) {
		this.permission = permission;
	}
}

public class proxy {
	public static void main(String[] args){
		Action action = new ProxyAction(new ViewAction());
		action.DoAction();
		//将用户信息的权限变成AddView,则上面的方法不能执行。
	  }
}

 这样,我们就将所有实现了Action接口的实现使用一个代理类来代理它们。除了ViewAction类能用,以后扩展的AddAction、       ModifyAction、DeleteAction类等等,都可以使用一个代理类:ProxyAction。

 

    而我们的客户端类似如下:
Action action = new ProxyAction(new ViewAction());
action.DoAction();

    通过对代理类的依赖注入,我们使得代理类初步有了一定扩展性。但是我们还要看到,这个代理类依赖于某一个确定的接口。这仍然不能满足我们的实际要求,如我 们的系统的权限控制一般是整个系统级的,这样系统级的权限控制,我们很难在整个系统里抽象出一个统一的接口,可能会有多个接口,按照上面的代理模式,我们 需要对每一个接口写一个代理类,同样,这些类的功能都是一样的。这显然不是一个好地解决办法。

    基于上面的原因,我们需要解决一个系统在没有统一的接口的情况下,对一些零散的对象的某一些动作使用代理模式的问题。JAVA API为我们引入了动态代理或动态委派的技术。

   
分享到:
评论

相关推荐

    JAVA设计模式之代理模式实例

    在Java编程领域,设计模式是一种解决常见问题的...理解并熟练运用代理模式,能够帮助开发者更好地设计和优化系统,提高代码的灵活性和可扩展性。在实际项目中,可以根据需求选择静态代理或动态代理,灵活应对各种场景。

    设计模式-代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色,特别是在iOS平台的应用程序设计中。代理模式的核心思想是为一个对象提供一个替身...在实际项目中,合理运用代理模式能够提高代码的可读性和可维护性。

    设计模式实现——代理模式

    理解并合理运用代理模式,可以提高代码的可维护性和可扩展性,是成为一名优秀的程序员必备的技能之一。在实际开发过程中,我们应该根据具体需求选择适合的代理类型,并灵活运用,以提升系统的整体性能和用户体验。

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

    源码分析可以帮助我们更好地理解代理模式的实现细节,并能将其运用到自己的项目中,提升代码的可扩展性和可维护性。 通过学习和实践代理模式,开发者可以更好地理解和掌握面向对象设计原则,如单一职责原则和开闭...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    Android设计模式之代理模式(Proxy Pattern)

    在软件工程中,设计模式是...通过理解并熟练运用代理模式,开发者能够编写出更灵活、可维护的代码,同时提高应用程序的性能和用户体验。在实际项目中,可以根据具体需求选择静态代理或动态代理,以达到最佳的设计效果。

    设计模式之代理模式demo

    在实际编程中,理解并熟练运用代理模式可以帮助我们更好地设计系统,提高代码的灵活性和可扩展性。通过代理,我们可以将复杂逻辑分解,使得代码更加模块化,同时也便于维护和测试。在学习代理模式时,可以尝试编写...

    android设计模式之代理模式

    通过查看代码,我们可以更深入地学习如何在实际项目中运用代理模式。然而,由于没有具体的代码内容,这里无法提供详细的代码解析。如果你能提供代码示例,我可以帮助你深入解析其工作原理和实现细节。

    C#设计模式—代理模式应用实例

    本实例将详细阐述如何在C#中运用代理模式。 代理模式的主要思想是为一个对象提供一个替身或代理,以便控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用,可以增加新的功能或者对原有功能进行...

    设计模式(抽象模式·工厂模式·代理模式·单列模式·)

    本资料包包含的是四种重要的设计模式:抽象模式、工厂模式、代理模式和单例模式。 1. 抽象模式: 抽象模式是通过定义抽象类或接口来封装一系列具有相似行为的对象。在面向对象编程中,抽象类通常不被实例化,而是...

    代理模式Demo代理模式代理模式Demo

    代理模式是一种设计模式,它在软件工程中扮演着重要的角色,允许我们为其他对象提供一个替代品或代理,以控制对这...通过理解和熟练运用代理模式,开发者能够更好地应对各种复杂的软件需求,提高软件设计的质量和效率。

    简单工厂模式、代理模式、策略模式如此相似

    在软件设计模式的世界里,"简单工厂模式"、"代理模式"和"策略模式"都是经典的设计模式,它们各自有着独特的应用场景和优缺点。本文将深入解析这三种模式的原理和区别,帮助读者理解它们在实际开发中的运用。 首先,...

    面向对象23种设计模式之代理模式

    代理模式是面向对象设计模式中的一个关键概念,它在软件工程中扮演着重要角色,用于在客户端和目标对象之间创建一种代理关系,以提供额外的功能...理解并熟练运用代理模式,可以帮助我们构建更灵活、可维护的软件系统。

    代理模式实例

    代理模式是一种设计模式,它是结构型模式的一种,主要用于在对象之间提供一个代理...在实际开发中,合理运用代理模式可以提高代码的可维护性和灵活性。通过学习和实践这个实例,你可以更好地掌握代理模式的原理和应用。

    设计模式专题之(六)代理模式---设计模式代理模式示例代码(python--c++)

    在实际开发中,理解并熟练运用代理模式可以帮助我们设计出更加优雅、易于维护的系统。无论是Python还是C++,都能借助代理模式实现对对象的灵活控制,提高代码的可读性和可维护性。同时,通过对比不同语言下的实现...

    动态代理设计模式 日志和源码

    动态代理设计模式是一种在运行时创建代理...而Spring AOP则是将这一模式运用到实际开发中的典范,使得我们可以方便地进行面向切面的编程。通过研究提供的源码,你可以深化对动态代理和AOP的理解,提升你的编程技能。

    代理模式小例子

    代理模式是一种设计模式,它在软件工程中扮演着重要的角色,允许我们为其他对象提供一个替代接口,以控制对原对象的访问。...在理解了这个小例子后,开发者可以更好地在自己的项目中运用代理模式,解决类似的问题。

    ios中的代理设置模式

    在iOS开发中,代理模式是一种常见的设计模式,用于对象间通信。它允许一个对象(委托者)将某些任务委托给另一个对象(代理),这样可以实现松耦合,提高代码的...理解并熟练运用代理模式对于提升iOS开发技能至关重要。

    简单工厂,代理模式,单例模式demo

    在众多设计模式中,“简单工厂”、“代理模式”和“单例模式”是三种常见的设计模式,它们各自有着明确的使用场景和设计目标。 首先,“简单工厂模式”是一种创建型模式,它定义了一个创建对象的接口,但让决定创建...

Global site tag (gtag.js) - Google Analytics