lishijia

专注移动互联网领域

Java模式之装饰者模式&代理模式 装饰模式与代理模式区别
1.2.2 装饰模式:就是可以动态的在目标对象中添加一些功能,有装饰者,有被装饰者。 其实它跟代理模式特别像。
              例子:可以把它理解为Spring的AOP,可以通过方法执行前进行装饰增加一些新功能
              装饰器模式的应用场景:
              1、需要扩展一个类的功能。
              2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
              缺点:产生过多相似的对象,不易排错!
1.2.3 代理模式:在目标对象执行的过程当中增加一个代理对象,也就是说在目标对象在想完成某一件事事情的时候,有一个代理者来帮他完成,而且还可以额外提供一些帮助介绍。
              它与装饰模式很想。
              例子:可以把它理解为Spring的AOP,可以通过方法执行前进行装饰增加一些新功能;它的代码几乎与装饰模式一样
              装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;它是在运行的时候才知道目标对象(也就是被装饰的对象)

              代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;它在编译的时候就清楚知道所需要代理的对象


代理模式

package com.sj.proxy;

public class Target implements ITarget{

    @Override
    public void method1() {
        System.out.println("这里是目标对象执行的方法");
    }

    
}
被代理类(目标类)

package com.sj.proxy;

public class Target implements ITarget{

	@Override
	public void method1() {
		System.out.println("这里是目标对象执行的方法");
	}

	
}
代理类
package com.sj.proxy;

public class Proxy implements ITarget {

	ITarget target;

	public Proxy() {

		this.target = new Target();

	}

	@Override
	public void method1() {
		this.before();
		target.method1();
		this.after();
	}

	public void before() {
		System.out.println("before target method");
	}

	public void after() {
		System.out.println("after target method");
	}

}

测试类

package com.sj.proxy;

public class Test {

	public static void main(String[] args) {

		ITarget proxy = new Proxy();
		proxy.method1();

	}

}

装饰模式:

package com.sj.decorator;

public interface ISource {

	public void work();
	
}

被装饰者

package com.sj.decorator;

public class ListView implements ISource {

	@Override
	public void work() {
		System.out.println("this is list view work function");
	}

}

装饰者

package com.sj.decorator;

public class ListViewExt implements ISource {

	private ISource listview;

	public ListViewExt(ISource listview) {
		this.listview = listview;
	}

	@Override
	public void work() {

		System.out.println("这里可以编写动态装饰的内容");

		listview.work();

		System.out.println("这里可以编写目标对象执行后装饰内容");

	}

}

测试类

package com.sj.decorator;

public class Test {
	public static void main(String[] args) {

		ISource listview2 = new ListViewExt(new ListView());
		listview2.work();

	}

}


以上两个模式的代理结构几乎一样,区别就在语义理解上;一个是增强,一个是控制

装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;它是在运行的时候才知道目标对象(也就是被装饰的对象)
代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;它在编译的时候就清楚知道所需要代理的对象


阅读更多
个人分类: java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Java模式之装饰者模式&代理模式 装饰模式与代理模式区别

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭