GOF23设计模式(六)

GOF设计模式之适配器(Adapter)模式与代理模式(Proxy pattern)

适配器(Adapter)模式

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

需要被适配的类

1
2
3
4
5
6
7
8
9
/**
* 需要被适配的类
*
*/
public class Adaptee {
public void request() {
System.out.println("可以完成需求功能");
}
}

适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 适配器
*
*/
public class Adapter implements Target{
private Adaptee adaptee;

public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}

@Override
public void qust() {
adaptee.request();
}
}

接口

1
2
3
public interface Target {
void qust();
}

测试

1
2
3
4
5
6
7
8
9
10
public class Client {
public void test(Target t) {
t.qust();
}
public static void main(String[] args) {
Client c=new Client();
Target t=new Adapter(new Adaptee());
c.test(t);
}
}

结果

可以完成需求功能

代理模式(Proxy pattern)

通过代理,控制对对象的访问。

静态代理

接口

1
2
3
4
5
6
7
8
9
10
11
12
public interface Star {
//面谈
void confer();
//签合同
void signContract();
//订票
void bookTicket();
//唱歌
void sing();
//收钱
void collectMoney();
}

真实对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class RealStar implements Star{
@Override
public void confer() {
System.out.println("RealStar.confer()");
}

@Override
public void signContract() {
System.out.println("RealStar.signContract()");
}

@Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
}

@Override
public void sing() {
System.out.println("RealStar(本人唱歌).sing()");
}

@Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}

代理对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class ProxyStar implements Star{
private Star star;
public ProxyStar(Star star) {
this.star = star;
}

@Override
public void confer() {
System.out.println("ProxyStar.confer()");
}

@Override
public void signContract() {
System.out.println("ProxyStar.signContract()");
}

@Override
public void bookTicket() {
System.out.println("ProxyStar.bookTicket()");
}

@Override
public void sing() {
//唱歌需歌手本人唱
star.sing();
}

@Override
public void collectMoney() {
System.out.println("ProxyStar.collectMoney()");
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
public class Client {
public static void main(String[] args) {
Star real=new RealStar();
Star proxy=new ProxyStar(real);
proxy.confer();
proxy.signContract();
proxy.bookTicket();
proxy.sing();
proxy.collectMoney();
}
}

结果

ProxyStar.confer()
ProxyStar.signContract()
ProxyStar.bookTicket()
RealStar(本人唱歌).sing()
ProxyStar.collectMoney()

动态代理

类接口和RealStar方法与上方一致

实现InvocationHandler接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class StarHandler implements InvocationHandler{
Star realStar;

public StarHandler(Star realStar) {
this.realStar = realStar;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object=null;
//这里有点问题
if(method.getName().equals("sing"))
{
object=method.invoke(realStar, args);
}
return object;
}
}

测试

1
2
3
4
5
6
7
8
9
public class Client {

public static void main(String[] args) {
Star realStar=new RealStar();
StarHandler handler=new StarHandler(realStar);
Star proxy=(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {Star.class}, handler);
proxy.sing();
}
}

结果

RealStar(本人唱歌).sing()

原创技术分享,您的支持将鼓励我继续创作
0%