设计模式笔记(7)The Adapter and Facade Patterns(适配器和外观模式)

本文深入探讨了适配器(Adapter)模式和外观(Facade)模式的概念及应用。通过具体实例,如使火鸡像鸭子一样被调用,展示了适配器如何解决接口不兼容的问题。同时,讲解了对象适配器与类适配器的区别。最后,介绍了外观模式如何简化子系统的使用,遵循最少知识原则,减少对象间的耦合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Adapter概念

Adapter(适配器):把一个类的接口转换成用户所期望的另一个接口。适配器能够让两个不兼容的接口一起工作。

假设你已经有一个软件系统,现在你想要让这个软件系统给一个新的供应商使用。但是你们的接口设计是不同的。适配器的工作就是作为他们之间的中间件。对接口的数据进行转换,使得这里两个能够在一起运行。(像个翻译)

在这里插入图片描述
在这里插入图片描述

实例

让火鸡(turkey)能够像鸭子(Duck)一样被调用:

//接口设计:鸭子
public interface Duck{
    public void quack();
    public void fly();
}


//接口设计:火鸡
public interface Turkey{
    public void gobble();
    public void fly();
}


//鸭子的一个实例
public class MallardDuck implements Duck{
    public void quck(){
        ....
    }
    
    public void fly(){
        ...
    }
}


//火鸡的一个实例
public class MallardTurkey implements Turkey{
    public void gobble(){
        ...
    }
    
    public void fly(){
        ...
    }
}

我们想要使用调用Duck的方式来调用Turkey的功能。就需要设计一个适配器的接口:

//适配器设计, 要实现Duck接口的所有方法。
public class TurkeyAdapter implements Duck{
	Turkey turkey;
    
    public TurkeyAdapter(Turkey turkey){
        this.turkey = turkey;
    }
    
    public void quack(){
        //Duck的quack方法映射到的Turkey方法。
        turkey.gobble();
    }
    
    public void fly(){
        turkey.fly();
    }
}

使用:

//step1
WildTurkey turkey = new WildTurkey();
//step2
Duck turkeyAdapter = new TurkeyAdapter(turkey);
//step3
turkeyAdapter.quack();
...

对象(Object)适配器和类(Class)适配器

  • 上面的例子就是Object Adapter。
    在这里插入图片描述

  • class Adapter需要多重继承才能使用,这在java里是不被允许的。但是如果使用其他的可以多重继承的语言,就可以使用类适配器。

    这时适配器是被代理的一个子类。

在这里插入图片描述

一个案例

古老的java代码对于结合遍历使用的是Enumeration接口。 在新的Java

的是迭代器Iterators接口。

如果项目中有古老的代码使用的是Enumeration接口。在继续写入新的代码时使用Iterator接口进行遍历。那么我们就要对之前的Enumeration设置一个代理。去实现Iterator接口的功能。

注意:在老的Enumeration中没有类似Iterator的remove功能。所以可以通过抛出一个UnsupportedOperationException()异常来处理。

Facade Pattern

概念

为一系列子系统接口提供了一个统一的接口。Facade定义了一个更高层的接口使得子系统更容易去使用。

是一个简单直接的方法。比如想看电视。那么就新建一个家庭影音的类,这个类的子函数watchMovie负责各个设备的协调工作。就是把复杂的过程包装了一下

设计原则

The Principle of Least Knowledge

减少对象之间的内在关系。

只和最亲近的朋友交流。

在设计时,对于任何的类,都要注意和它所影响饿类的数量以及是如何影响其他的类的。

避免大量类之间耦合。

//没有遵循最少知识原则
Thermometer thermometer = station.getThermomter();
reutrn thermoeter.getTemperature();


//遵循原则的设计
//在station类中天街getTemperature()方法,减少耦合。
return station.getTempetature();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值