什么是装饰器模式和代理模式,以及它们之间的区别?
一. 装饰器模式
概念:装饰器模式就是给一个对象动态的增加一些功能,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
类结构图:
代码理解:
1.先定义一个抽象接口Sourceable
package com.sjms.decorator; public interface Sourceable { //自定义抽象方法 void method(); } |
2.定义一个实现类Source 实现抽象接口Sourceable
package com.sjms.decorator; public class Source implements Sourceable { @Override public void method() { System.out.println("素颜可以如此之美!"); } }
|
3.定义一个装饰类Decorator实现Sourceable接口,装饰类持有被装饰对象的实例
package com.sjms.decorator; public class Decorator implements Sourceable { private Sourceable source; public Decorator(Sourceable source){ this.source=source; } @Override public void method() { source.method();//保持原功能不变 System.out.println("化妆之后你会更美"); } } |
4.测试
package com.sjms.decorator; public class SourceableTest { public static void main(String[] args) { Sourceable sourceable = new Source(); sourceable.method(); System.out.println("------------------------------"); // 接下来使用装饰类实现功能 Sourceable sourceable1 = new Decorator(sourceable);//把要装饰的实例传给装饰类 sourceable1.method(); } } |
实际意义:
可以实现一个类功能的扩展。 可以动态的增加功能,而且还能动态撤销(继承不行)。
缺点:产生过多相似的对象,不易排错。
(装饰器模式体现了合成复用原则)
二.代理模式
概念: 代理模式就是找一个代理类替原对象进行一些操作。 比如我们在租房子的时候找中介,再如我们打官司需要请律师,中介和律师在这里就是我们的代理。
类结构图:
代码理解:
1.先定义一个抽象接口Sourceable
package com.sjms.proxy; public interface Sourceable { //自定义抽象方法 void method(); } |
2.定义一个实现类Source 实现抽象接口Sourceable
package com.sjms.proxy; public class Source implements Sourceable { @Override public void method() { System.out.println("素颜可以如此之美!"); } }
|
3.定义一个代理类实现接口
public class Proxy implements Sourceable { private Source source; public Proxy() { source = new Source(); } @Override public void method() { source.method(); System.out.println("我和装饰器模式其实是不一样的!"); } }
|
4.测试
package com.sjms.proxy; public class SourceableTest { public static void main(String[] args) { System.out.println("代理模式--------"); Sourceable sourceable2 = new Proxy(); sourceable2.method(); } }
|
实际意义:
如果在使用的时候需要对原有的方法进行改进,可以采用一个代理类调用原有方法,并且对产生的结果进行控制,这种方式就是代理模式。 使用代理模式,可以将功能划分的更加清晰,有助于后期维护。
三.代理模式和装饰器模式的区别
装饰器模式通常的做法是将原始对象作为一个参数传给装饰者的构造器,而代理模式通常在一个代理类中创建一个被代理类的对象。 装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。(两者都是结构型设计模式)
-----随后补充在java相关技术框架,用到这两种设计模式的场景----