`
shuofenglxy
  • 浏览: 189426 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

菜鸟硕枫设计模式系列之12 代理模式一

阅读更多
代理模式貌似是java中用途最广的设计模式之一,也是最重要的设计模式之一。使用代理模式能够封装设计细节,甚至能够改变被代理对象的行为,也可以在被代理对象开始行为之前做一些前期的处理【权限认证,开启事务等等就可以在这个地方做】。我们先看看前面两种代理方式:兄弟代理和父子代理。代理模式也是一种结构型模式。

代理模式类图:
  
              


具体demo:
兄弟代理是指被代理对象实现了某一接口,那么可以用代理去实现这一接口,从而能够代替被代理对象完成接口行为。
Person接口:
package proxyPattern;

public interface Person {

	void work();
	void play();
}


实现:
package proxyPattern;

public class Man implements Person{
	private String name;
	public Man(String name){
		this.name = name;
	}

	public void work() {
		System.out.println(name+"says Work is very hard");
	}

	public void play() {
		System.out.println(name+"says Playing is very hard");
	}

	
}


代理:
package proxyPattern;

public class Proxy implements Person{
	private Man man;
	
	public Proxy(Man man){
		this.man = man;
	}
	@Override
	public void work() {
		System.out.println("Proxy says Work is very hard");
		man.work();
	}

	public void play() {
		System.out.println("Proxy says Playing is very hard");
		man.play();
	}

}


测试类:
package proxyPattern;

public class ProxyTest {

	public static void main(String[] args){
		
		Man man = new Man("lxy");
		man.work();
		man.play();
		
		Proxy proxy = new Proxy(man);
		proxy.work();
		proxy.play();
	}
}


父子代理:被代理对象没有实现接口,那么可以使用代理类去继承这个被代理对象的类,覆写想要代理的方法即可。
package proxyPattern;

public class Woman {

	private String name;
	public Woman(String name){
		this.name = name;
	}
	
	public void Shopping(){
		System.out.println("Shopping is always  a happy thing");
	}
}



代理2
package proxyPattern;

public class Proxy2 extends Woman{

	private Woman woman;
	public Proxy2(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}
	public void SetWoman(Woman woman){
		this.woman = woman;
		
	}

	public void Shopping(){
		System.out.println("Nothing Funny");
		woman.Shopping();
	}
}



测试类2:
package proxyPattern;

public class Proxy2Test {

	public static void main(String[] args){
		
		Woman woman = new Woman("meimei");
		woman.Shopping();
		
		Proxy2 proxy2 = new Proxy2("proxy2");
		proxy2.SetWoman(woman);
		proxy2.Shopping();
		
	}
}


说明:兄弟代理和父子代理的本质都是复写原有的行为方法,只是由于原有类实现或者没有实现接口,所以在复写策略上有不同而已。父子代理是典型的里氏代换原则的示例demo.这两种方式都是静态代理,下一讲将看到java的重要特点----反射机制的动态代理。



  • 大小: 11.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics