静(动)态代理模式、适配器模式

一、代理模式(Proxy):

(1)静态代理模式:

简单理解:

一个人或事物代替另一个人或事物做某件事。例如:在Tom自我介绍之前,代理器自动帮他说Hello。

实现:

 1 public interface Subject {
 2
 3     public void print();
 4 }
 5
 6 public class RealSubject implements Subject{
 7
 8     public void print(){
 9         System.out.println("I am Tom");
10     }
11
12 }
13
14 public class Proxy implements Subject {
15     private Subject subject;
16     public Proxy(Subject subject){
17         this.subject=subject;
18     }
19     @Override
20     public void print() {
21         // TODO Auto-generated method stub
22         System.out.println("Hello");
23         this.subject.print();
24     }
25 }
26
27 public class Test {
28
29     public static void main(String[] args) {
30         Subject staticProxy=new RealSubject();
31         Proxy proxy=new Proxy(staticProxy);
32         proxy.print();
33
34     }
35 }

输出:

Hello
I am Tom

静态代理模式的缺点

静态代理模式写的太死,不利于维护和扩展。也就是说当我们有多个目标对象需要代理时,我就需要建立多个代理类,改变原有的代码。

动态代理模式运用反射解决了这个每个代理类都要重复写的问题。

(2)动态代理模式:

实现:

 1 public interface IAnimal {
 2
 3     public void go();
 4     public void bark();
 5 }
 6
 7 public class Cat implements IAnimal {
 8
 9     @Override
10     public void go() {
11         // TODO Auto-generated method stub
12         System.out.println("going...");
13     }
14
15     @Override
16     public void bark() {
17         // TODO Auto-generated method stub
18         System.out.println("barking...");
19     }
20
21 }
22
23 public class DyProxy implements InvocationHandler{
24
25     private Object obj;
26
27     public DyProxy(Object obj){
28         this.obj=obj;
29     }
30
31     @Override
32     public Object invoke(Object proxy, Method method, Object[] args)
33             throws Throwable {
34         // TODO Auto-generated method stub
35
36         System.out.println("动态代理!");
37
38         return method.invoke(this.obj, args);
39     }
40
41 }
42
43 public class Test {
44
45     public static void main(String[] args) {
46
47         IAnimal animal=new Cat();
48
49         InvocationHandler handler=new DyProxy(animal);
50
51         Object o=Proxy.newProxyInstance(animal.getClass().getClassLoader(),
52                 animal.getClass().getInterfaces(), handler);
53
54         ((IAnimal)o).go();
55         ((IAnimal)o).bark();
56
57     }
58 }

输出:

动态代理!
going...
动态代理!
barking...

二、适配器模式(Adapter):

简单理解:

将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

就像翻译官能让两个不同语言的人沟通;手机充电器能降压给手机充电。

(1)类的适配器模式(采用继承实现):

适配器使本来无法兼容到一起的植物和动物产生了联系。

 1 public interface Plant {
 2     public void water();
 3 }
 4
 5 public class Animal {
 6
 7     public void bark(){
 8         System.out.println("叫");
 9     }
10
11 }
12
13 public class Adapter extends Animal implements Plant{
14
15     @Override
16     public void water() {
17         // TODO Auto-generated method stub
18         super.bark();
19     }
20
21 }
22
23 public class Test {
24
25     public static void main(String[] args) {
26         Plant p=new Adapter();
27         p.water();
28     }
29 }

(2)对象适配器模式(采用对象组合方式实现): 

 1 public interface Plant {
 2
 3     public void water();
 4 }
 5
 6 public class Animal {
 7
 8     public void bark(){
 9         System.out.println("叫");
10     }
11 }
12
13 public class Adapter implements Plant{
14     private Animal animal=new Animal();
15     @Override
16     public void water() {
17         // TODO Auto-generated method stub
18         animal.bark();
19     }
20
21 }
22
23 public class Test {
24
25     public static void main(String[] args) {
26         Plant p=new Adapter();
27         p.water();
28     }
29 }
时间: 2024-08-07 00:15:26

静(动)态代理模式、适配器模式的相关文章

JAVA笔记7__接口应用/Object类/简单工厂模式/静态代理模式/适配器模式

/** * 接口应用 */ public class Main { public static void main(String[] args) { Person p = new Person("fish7"); p.setIsay(new BeforeGong()); p.say(); p.setIsay(new AfterGong()); p.say(); } } class Person{ //只有在运行期才和say行为关联起来,这就叫面向接口编程 private String

装饰者模式,适配器模式,代理模式区别

装饰者模式的关注点在于添加功能 代理模式的关注点在于控制对象的访问,其原型对象对于用户无法得知 适配器模式关注点在于适配,从定义上看装饰模式是对核心对象或者功能的扩展,适配器模式是把对象或者功能放到一个新对象中引用.举个例子,现在书城卖道德经的书,有线装版,有精装版,有日文版,有英文版,其中线装版和精装版就是装饰模式,日文版和英文版就是适配器模式,各种版本都是为迎合不同消费者的不同需求.为什么呢?因为线装版和精装版的道德经虽然包装不同,但内容相同,日文版和英文版就不同,这两个版本的内容就可能和原

从公司买火车票到代理模式和适配器模式

近期看到一些设计模式的文章,自己也有了些想法. 现公司是个爱出差的公司,不可避免要买许多火车票.这个买票的流程一直在变化. 最开始大家都是自己买火车票,然后回公司的时候报销. 就像这样: public class AtFirst { public static void main(String[] args) { EmployeeABuy. Abuy(); //报销 EmployeeBBuy. Bbuy(); //报销 } } class EmployeeABuy{ public static

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

适配器模式与代理模式

1.简介 适配器模式:适配器模式(英语:adapter pattern)有时候也称包装样式或者包装.将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类别自己的接口包裹在一个已存在的类中. 代理模式:代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 2.困惑 设计模式总是通过增加层来进行解耦合,提高扩展性,但是如果我们没法从在这

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式. 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清. 今天再重新学习下,把学习心得分享给大家一下.这次是结合的我工作中的实际项目. 设计模式,其实是一种解决方法,JAVA作为一种面向对象的语言,对于所有的设计模式在实现上,总是少不了对接口的实现,对抽象类的继承,有时候似乎是为了去实现接口而去写接口,所以在这三种模式的说明代码中,我们都定义了接口这些东西,所以才有了现在的混淆. 先不厌其烦的介绍

模式的秘密-适配器模式和代理模式的区别

一.简介        适配器模式:适配器模式(英语:adapter pattern)有时候也称包装样式或者包装.将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中.        代理模式:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二.困惑        设计模式总是通过增加层来进行解耦合,提高扩展性

设计模式之代理模式、适配器模式和外观模式

编写基于另一组类的包装器接口是一项常见的API设计任务,例如,你的工作可能是维护一个大型的遗留代码库,相比重构所有代码,你更愿意审计一个新的 ,更简洁的API,以隐藏所有的底层遗留代码:或者你可能已经编写了一个C++API,后来需要给特定客户提供C接口:或者你的API用到了一个第三方依赖库,你想让客户直接使用此库,但是又不想将此库直接暴露给客户. 创建包装器API的潜在副作用是影响性能,这主要因为额外增加的一级间接寻址以及存储包装层次状态带来的开销.但就上面提到的那些情而言,这么做可以创建质量更

适配器模式、装饰模式、代理模式异同

此三者均是对旧的对象进行封装以提供新的行为,实际上都包含了代理的概念,但实际使用时又有所区别: 适配器模式:将A接口的实现封装后表现出了B接口的行为 装饰模式:将A接口的实现封装后仍然表现出A接口的行为,但在行为逻辑上与原来不同 代理模式:将A接口的实现封装后仍然表现出A接口的行为,这一点上与装饰模式相同,所以非常容易混淆;实际上装饰模式确实可以认为是代理模式的一种类型,因为装饰模式的代理目标局限于一个普通的Java对象,而代理模式中代理目标则更自由,远程代理中它是存在于另一台主机上,虚拟代理中