当我谈Proxy与Adpater模式时,我谈些什么

网络测
• 阅读 1670

当我谈Proxy与Adpater模式时,我谈些什么

前言

今天跟同事谈起了一道面试题:“Proxy模式跟Adpater模式的区别”,这两个设计模式都是很相似的模式,很多有点经验的程序员都可能会聊的头头是道,但是恐怕谈起一些设计上的细节可能就会卡壳,因此我写下了这篇文章,以此作为一个简短的回顾。

Adapter(适配器)模式

Adpater属于两种适应设计模式中的其中一种,另外一种是Iterator(迭代器)模式,下次有机会再仔细聊聊它。

设计模式的书很喜欢以‘电源适配器插头’作为适配器模式的范例范例,那么我们也从这个例子开始吧。

参与模式的角色

1. Target (适配接口)

暴露给调用方的接口,定义了被适配对象暴露的方法。(我们需要220V的电源)

2. Client (请求者)

实际需要使用接口的逻辑(某电器需要使用220V的电源)

3. Adaptee(被适配对象)

被适配者,包含了具体的实现,及可能不太合适调用方使用的方法。(110V的电源不合适现在所用的电器)

4. Adpater(适配器)

实际适配的实现,用继承的方式隐藏了被适配对象的实现,又以实现适配接口的方式暴露调用者适合的方法。

UML类图

当我谈Proxy与Adpater模式时,我谈些什么

范例代码

下面的代码实现了一个输出110V的电源,通过220V电源适配器,实现了一个符合22V标准接口的输出,提供给客户端的示范。

#  adpatee
public class Power110v {

    private int volte = 110;
    
    public Power110v(){
        System.out.print("the power is on at "+volte+"V");
    }
    
    public String get100vPower(){
        return volte;    
    }
    
}

# target
public interface Power220v {
    get220vPower(String input);
}

# adapter 
public PowerAdpater extends Power110v implemnts Power220v {
    
    public get220vPower(){
        volte = volte * 2;
        System.out.println("the power is on at "+volte+"V")
    }
    
}

#client
public class Main (){
    
    public static void main(String[] args){
    
        PowerAdapter pa = new PowerAdapter();
        pa.get220vPower();
        
    }
    
}

小结

Adapter模式适用于那些已有代码很稳定,但新调用方需要对部分代码进行调整,或者组合多个方法进行组合实现逻辑的情况下适用。可以尽量适用已有的稳定代码,只作适当的修改便可以完成新的逻辑功能。

Proxy模式

参与模式的角色

1. Client

使用proxy的角色,功能的调用方,下面的例子是Manager(经理)类。

2. Subject

定义了proxy角色与RealSubject的一致性接口,范例代码中,是Reportable(可汇报)接口,

3. Proxy

Proxy会处理来自Client的请求,可以处理的功能自己处理,不能处理的功能让RealSubject处理,范例代码是TeamLeader类。

4. RealSubject

RealSubject将会在Proxy缺乏功能时提供实现,跟Proxy一样实现同样的接口,范例代码中是TeamMember类。

UML

当我谈Proxy与Adpater模式时,我谈些什么

范例代码
public interface Reportable{
    public void setReportMatrial(String jobContent);
    public String getReportMatrial();
    public String getFeedback();
}

public TeamMember implements Reportable{
    String reportMatrial;
    
    public void setReportMatrial(String input){
        this.reportMatrial = input;
    }
    
    public String getReportMatrial(){
        return this.reportMatrial;
    }
    
    public String getFeedback(){
        return "Here is the report content ["+this.reportMatrial+"]";
    }
}
    
}

public TeamLeader implements Reportable{

    String reportMatrial;
    TeamMember member;
    
    public TeamLeader(String input){
        this.reportMatrial = input;
    }
    
    public void setReportMatrial(String input){
        if (member != null){
            member.setReportMatrial(input)
        }
        this.reportMatrial = input;
    }
    
    public String getReportMatrial(){
        return this.reportMatrial;
    }
    
    public String getFeedback(){
        if ( member != null ){
            return member.getFeedback();
        }
        member = new TeamMember();
        member.setReportMatrial(this.reportMatrial);
    }
    
    
}

public class Manager {
    public static void main(String[] args){
        TeamLeader tl = new TeamLeader("monthly report");
        tl.setReportMatrial("weekly report")
        String currentReportType = tl.getReportMatrial();
        // the manager forgot what kind report should receive
        System.out.println("the current report type is " + currentReportType);
        // the manager ask the teamleader for the report detail.
        System.out.println("get some report from team leader"tl.getFeedback());
    }
}

Proxy与Adpater的总结

相同点

两者头通过实现接口暴露实际逻辑给调用方,核心逻辑都在最内一层的类中。

不同点

Proxy实现subject类与proxy类,都是实现一样的接口,暴露一样的方法。Adpater模式则Adpater与Adpatee则不一定实现同样的方法。理论上Proxy模式的proxy类,也承担一部分的功能,当它无法实现调用功能时才会创建被代理的RealSubject类。Adpater类则原则上与Adpatee共存亡。

参考资料

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
java中饿汉与懒汉的故事(单例设计模式)
java中的单例设计模式关于设计模式,这其实是单独存在的东西,它不属于java,但是在java中使用较多,所以今天我就给大家介绍下单例设计模式中的饿汉和懒汉这俩朴素的打工人。首先我先说明下单例设计模式是啥(如果不想了解,可以直接划下去看饿汉和懒汉):类的单例设计模式就是采用一定的方法保证在整个软件系统中,对某个类只能存在一
Dubbo架构设计与源码解析(三)责任链模式
责任链模式是设计模式中简单且常见的设计模式,可能我们日常中也会经常应用责任链模式,dubbo中的责任链模式将灵活性发挥的很充分。
架构师日记-深入理解软件设计模式 | 京东云技术团队
本文从设计模式与编程语言的关系,设计模式与架构模式的区别,设计原则和设计模式的关系等几个维度进行了分析和解答。关于设计模式应该如何学习和应用的问题,给出了学习意见和实践心得。
捉虫大师 捉虫大师
4年前
当我们谈注册中心时我们谈什么
本文已收录https://github.com/lkxiaolou/lkxiaolou欢迎star。最近工作重心转向了注册中心,于是想来写一篇关于注册中心的文章概念什么是注册中心,以大多数人熟悉的RPC框架来说,通常RPC中有三种角色:provider服务提供者consumer服务消费者,即调用方registry注册中心,让consumer
Wesley13 Wesley13
4年前
java技术学习路线(自用)
一:常见模式与工具    1.常用设计模式:                 1.1.Proxy代理模式:指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。详见https://www.cnblogs.com/qifengshi/p/6566752.html       
九路 九路
5年前
Java实现 一篇文章说尽设计模式之六大原则
我们知道,设计模式很有用,学好设计模式不但能让你写出更简洁,优雅的代码,还能使得代码的结构更清晰,也更有利于扩展当然设计模式也不是万能的,一成不变的.设计模式只是前人总结出来的一种经验,一种特定问题的解决方法,不能看作是死的东西不一定非要生搬硬套,非得按照设计模式书上来来,只要我们写的代码符合一定的一些原则,一样可以看作是自己的模式.但是前人总结
Stella981 Stella981
4年前
Apache commons chain 初探
Apachecommonschain是什么Apachecommonchain是对责任链设计模式的改造封装,让使用者更加方便的使用。简单回顾一下责任链设计模式在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(ChainofResponsibility)模式的:责任链模式是一种对象的行为模式。在
Wesley13 Wesley13
4年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
Wesley13 Wesley13
4年前
Java描述设计模式(06):建造者模式
一、生活场景基于建造者模式,描述软件开发的流程。1、代码实现/基于建造者模式描述软件开发/publicclassC01_InScene{publicstaticvoidmain(Stringargs){B
玩转Spring状态机 | 京东云技术团队
说起Spring状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring状态机就是状态模式的一种实现,在介绍Spring状态机之前,让我们来看看设计模式中的状态模式。1\.状态模式状态模式的定义如下:状态模式(StatePat
工程中实践的微服务设计模式
最近在读《微服务架构设计模式》,开始的时候我非常的好奇,因为在我印象中,设计模式是常说的那23种设计模式,而微服务的设计模式又是什么呢?这个问题也留给大家,在文末我会附上我对这个问题的理解。本次文章的内容主要是工作中对微服务设计模式的应用,希望能对大家有所