适配器模式

本文是设计模式之禅笔记,介绍了面向对象程序设计中设计模式的六大原则,包括单一职责、里氏替换等,强调结合实际项目使用。还说明了看懂设计模式需具备UML类图和时序图的基本能力,并以适配器模式为例进行分析,指出通过代码实现理解设计模式更有效。

设计模式之禅笔记

在面向对象程序设计中,遇到问题之后总结问题的成功经验和最佳实践形成了设计模式

设计模式有为人熟知的六大原则

 

六大原则

● 单一职责

要求一个接口或者一个类只有一种职责;

● 里氏替换

A类对应的对象a,都可以由B类任意的对象所替换,功能正常,就说B是A的子类;

最清晰的定义:所有引用基类的地方必须能透明地使用其子类的对象。

● 依赖倒置

高层模块不应该依赖低层模块,两者都应该依赖其抽象;(实现类不应该相依赖,应通过抽象类活接口进行依赖)

抽象不应该依赖细节;(接口或者抽象类不应该依赖实现类)

细节应该依赖抽象;(实现类应该依赖抽象类或者接口)

● 接口隔离原则

接口细化,但是粒度过小也是不明智的,会导致接口剧增,推荐根据经验和常识决定接口的粒度大小;

● 迪米特法则

最少知识原则,一个类应该对自己需要耦合或调用的类知道得最少;

● 开闭原则

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭

 

将这六大原则结合使用能使设计模式更加稳固,灵活,健壮;但是并不是绝对的遵守这六大原则,要结合自己项目的实际功能去尽可能的贴合,例如接口隔离原则;这六大原则基本可以应对大多数的变化,但是适当时候也可以根据实际情况扩充一些规则,类的编写要尽可能的保持高内聚,低耦合。

 

MVC很容易被混淆,MVC其实不是设计模式,而是架构模式,也可以说是框架,基于这种架构可以设计出一些框架,例如Spring;

 

 

如何看懂设计模式

首先设计模式的文章书籍一般是由UML类图和时序图进行讲解的,所以关于UML类图和时序图我们需要具备可以看懂的基本能力;

类图的关系有这几种:泛化,实现,关联、聚合、组合、依赖;在图中是通过实线/虚线,箭头形状等进行区分的;如下图:

 

 

时序图指的是序列图/UML交互图,主要体现对象是怎么交互的,并且把重点放在消息序列上,时序图有两个坐标轴,纵轴表示时间,横轴表示对象,下面是网上找到的适配器模式时序图,可以结合再下面的适配器模式举例进行理解;

 

 

设计模式举例

设计模式分为三大类:创建型设计模式(例如单例模式),结构性设计模式(例如适配器模式),行为型设计模式(例如观察者模式);下面就适配器模式进行分析,之后再各类型进行补充;

 

适配器模式(结构型)

分为类适配器和对象适配器

 

类适配器的UmL图如下:

 

target想要调用request()方法,但是Adaptee没有该方法,所以提供了一个中间缓解adapter类,继承Adaptee的接口,实现target接口;

adapter:指适配器

 

简易代码如下(java):

public interface Target {
     //这是源类Adapteee没有的方法
    public void Request(); 
}


//源 类 
public class Adaptee {
    public void SpecificRequest(){
    }
}


//适配器Adapter继承Adaptee,同时实现目标(Target)接口。
public class Adapter extends Adaptee implements Target {
//适配器是将SpecificRequest()方法作了一层封装,封装成Target可以调用的Request()
    @Override
    public void Request() {
        this.SpecificRequest();
    }
}


// 具体使用时的类,实例化一个Adapter类,调用request方法
public class AdapterPattern {
    public static void main(String[] args){
        Target mAdapter = new Adapter();
        mAdapter.Request();     
    }

 

 

对象适配器

 

场景和类适配器相同,target类想要调用Adaptee的request()方法,但是Adaptee没有,所以adapter类作为一个中间类,实例化了一个Adaptee的对象,以此把target和Adaptee连接起来

 

代码上的区别只有adapter类以及使用适配器的方式不相同,前面创建target接口以及被适配的类Adaptee就不再重复;

class Adapter implements Target{  
    // 直接关联被适配类  
    private Adaptee adaptee;  
    public Adapter (Adaptee adaptee) {  
        this.adaptee = adaptee;  
    }  
    // 实现了一个request方法用来给target类进行调用
    @Override  
    public void Request() {  
        // 这里是使用委托的方式调用SpecificRequest()
        this.adaptee.SpecificRequest();  
    }  
}  


public class AdapterPattern {
    public static void main(String[] args){
        //创建一个被适配类的对象作为参数传入Adapter  
        Target mAdapter = new Adapter(new Adaptee());
        mAdapter.Request();
    }
}

 

适配器模式主要用于把一个接口转换成客户需要的另一个接口;也可以叫包装器;可以将两个没有关系的类结合在一起运行;增加了透明度,target不需要去了解adaptee内部是多么复杂,仅通过adapter类去调用自己需要的方法即可;这个模式大多是用户系统扩展时使用;

 

总结

设计模式是由前人的经验总结出来的一种思想;仅仅看了书籍或者文章是很难去真正理解或变成自己的知识的,最好还是通过代码实现进行理解,会更利于记忆,也能在下次编写代码时能很容易的应用设计模式的思想;这边只写了适配器模式,但是还有二十多种其他的设计模式,其中常用的还是需要深入的去理解;有什么问题欢迎指正~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值