装饰器 : 装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
被装饰对象通过注入的方式进行初始化
代理:如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
装饰器和代理的共同点和区别
1、装饰对象和被装饰对象、代理对象和被代理对象都实现同一个接口。装饰对象持有被装饰对象的引用,代理对象持有被代理对象的引用
2、装饰对象持有的被装饰对象是动态注入的,代理对象持有的被代理对象是固定生成在代理类中的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。
装饰器设计模式:
package com.java.test.decorator;
/**
*
* @author lixiaoming
*
*/
public interface ISource {
public void method1();
}
package com.java.test.decorator;
/**
* Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能
*
* @author lixiaoming
*
*/
public class SourceImpl implements ISource {
public void method1() {
System.out.println("Source , method1()");
}
}
package com.java.test.decorator;
/**
* 被装饰对象 装饰对象和被装饰对象实现同一个接口,
* 装饰对象持有被装饰对象的实例
*
* Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能
*
* */
public class Decorator implements ISource {
ISource source = null;
public Decorator(ISource source){
this.source = source;
}
public void method1() {
System.out.println("Decorator method1() start"); // 这个是起到装饰作用的
source.method1(); // 这是原来的
System.out.println("Decorator method1() end"); // 这个是起到装饰作用的
}
}
package com.java.test.decorator;
/**
*
* 装饰器模式的应用场景:
* 1、需要扩展一个类的功能。
* 2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
* @author lixiaoming
*
*/
public class DecoratorTest {
/**
* @param args
*/
public static void main(String[] args) {
ISource source = new SourceImpl();
Decorator decorator = new Decorator(source);
decorator.method1();
}
}
执行结果:
Decorator method1() start
Source , method1()
Decorator method1() end
代理模式:
package com.java.test.proxy;
public interface ISource {
public void method1();
}
package com.java.test.proxy;
public class SourceImpl implements ISource{
@Override
public void method1() {
System.out.println("SourceImpl , method1()");
}
}
package com.java.test.proxy;
public class SourceProxy implements ISource{
private SourceImpl sourceImpl; // 注意持有对象的区别(在代理类的内部生成)
public SourceProxy(){
this.sourceImpl = new SourceImpl();
}
@Override
public void method1() {
System.out.println("SourceProxy method1() start");
sourceImpl.method1();
System.out.println("SourceProxy method1() end");
}
}
package com.java.test.proxy;
public class ProxyTest {
/**
* @param args
*/
public static void main(String[] args) {
ISource proxyObj = new SourceProxy();
proxyObj.method1();
}
}
执行结果:
SourceProxy method1() start
SourceImpl , method1()
SourceProxy method1() end