HeadFirst设计模式篇六:适配器模式与外观模式

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

问题引入:

有一只火鸡,想用火鸡冒充鸭子,已知火鸡的类如下图:

鸭子的接口为:

解决方案:

提供一个由火鸡转为鸭子的适配类,这个适配器类需要实现Duck接口。

public class TurkeyAdapter implements Duck {

    private Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    @Override
    public void quack() {
        turkey.gobble();
    }

    @Override
    public void fly() {
        turkey.fly();
    }
}

适配器模式:

将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

对象适配器:采用组合的方式,上述的示例就是使用的组合方式

类适配器:采用继承的方式实现。利用继承解决方案如下:

public class TurkeyAdapter2 extends WildTurkey implements Duck  {
    @Override
    public void quack() {
        super.gobble();
    }

    @Override
    public void fly() {
        super.fly();
    }
}

两种适配器的比较

类适配器针对的是具体的类做的适配,因为一个适配器只能适配一个具体类,而对象适配器是利用的组合,一个适配器可以针对所有子类。

问题引入:

观赏电影需要执行一系列的动作,例如将灯光调暗,将屏幕放下,打开功放,调高音量,打开dvd。。。。

而这些操作是多个类的行为。如何让使用者不关心这些复杂的过程呢?

引入外观设计模式:

创建一个接口简化而统一的类,用来包装子系统中一个或者多个复杂的类。

外观模式的定义:

提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易实现。

最少知识原则:只和你的密友谈话。

减少对象之间的交互,不要让太多的类耦合在一起,免得修改系统中的一部分,会影响到其他部分。如果许多类中相互依赖,那么这个系统将会变得复杂、易碎、不便维护。

如何避免违背最少知识的原则:

1、如果某个对象调用其他的方法的返回结果,不要调用该对象的方法。

2、把组件想象成是被实例变量所引用的任何对象,换句话说,把这想象是“有一个”关系。

对象适配器模式、外观模式、装饰者模式的区别:

适配器是将一个对象包装起来以改变其接口;

装饰着将一个对象包装起来以增加新的行为和责任;而外观将一群对象包装起来以简化其接口。

转载于:https://my.oschina.net/silence88/blog/1036366

你可能感兴趣的:(设计模式,python)