外观模式和适配器模式都是对接口进行了封装,所以两者比较容易混淆。区分外观模式和适配器模式的关键点在于搞清楚接口封装的原因。以下分别说明:,,- 适配器模式调用方和被调用方都是已经存在的,但是接口不匹配,此时需要使用适配器模式将接口转换成用户可以调用的另外一个接口。 ,- 外观模式是定义了新的接口,处理多个子系统之间的交互。它提供了一个统一的接口,用来访问子系统中的一群接口。
在软件设计中,我们经常会遇到这样的问题:一个应用程序需要与多个子系统进行交互,这些子系统可能有不同的功能、接口和数据结构,如果每个子系统都有自己的界面和交互方式,那么应用程序就需要为每个子系统编写相应的代码,这将导致代码冗余、难以维护和扩展,为了解决这个问题,我们可以使用外观模式(Facade Pattern)来简化子系统之间的交互。
外观模式是一种创建型设计模式,它为子系统中的一组接口提供了一个统一的高层接口,使得子系统可以更加简单地与其他系统集成,在外观模式中,客户端只需要与外观类进行交互,而不需要了解子系统的具体实现,这样,当子系统的内部实现发生变化时,客户端无需修改代码,只需修改外观类即可。
下面我们通过一个简单的例子来说明外观模式的使用,假设我们有一个汽车系统,它包括发动机、变速器、刹车和轮胎等组件,每个组件都有自己的接口和实现,但是它们之间需要进行协同工作,为了简化这种协同工作,我们可以为这些组件创建一个外观类,该类提供了一个统一的接口,使得其他部分可以更加方便地使用这些组件。
我们定义一个汽车类(Car),它包含一个发动机对象(Engine)和一个变速器对象(Transmission):
class Engine: def start(self): print("发动机启动") class Transmission: def shift(self): print("变速器换挡") class Car: def __init__(self): self.engine = Engine() self.transmission = Transmission()
我们创建一个外观类(CarFacade),它包含一个发动机对象和一个变速器对象,并提供一些公共方法来控制这两个对象的行为:
class CarFacade: def __init__(self): self.engine = Engine() self.transmission = Transmission() def start(self): self.engine.start() self.transmission.shift() def stop(self): print("汽车停止")
我们可以在其他部分使用这个外观类来控制汽车的行为,在一个测试类中,我们可以创建一个汽车对象和一个外观对象,然后调用外观对象的方法来控制汽车的启动和停止:
class TestCarFacade: def test_car_facade(self): car = Car() facade = CarFacade() facade.start() # 输出:发动机启动 -> 变速器换挡 -> 汽车停止 facade.stop() # 输出:汽车停止
通过这种方式,我们可以将复杂的子系统抽象成一个简单的外观对象,从而简化了客户端与子系统之间的交互,当子系统的内部实现发生变化时,我们只需要修改外观类的实现,而无需修改客户端的代码,这种设计模式有助于提高代码的可维护性和可扩展性。