适配器模式与外观模式

来源:互联网 发布:占星术杀人魔法 知乎 编辑:程序博客网 时间:2024/05/18 19:42

    • 适配器模式
      • 定义
      • 案例
        • 把火鸡适配成一只鸭子
        • 枚举类适配成迭代器
      • 模式框架
    • 外观模式
      • 定义
      • 最少知识原则
    • 装饰者与适配器的比较
    • 适配器与外观的比较

适配器模式

定义

将一个类的接口,转换成客户端期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。分为: - 对象适配器     被适配者作为一个实例(被适配者)组合到适配器中,用这个实例完成目标接口(适配者)的动作 - 类适配器 -多继承不适合java     适配器同时继承适配者与被适配者,用被被适配者的方法方式实现适配者的方法

案例

把火鸡适配成一只鸭子

让火鸡实现鸭子的叫唤和飞的动作。

/** * 对象继承 :适配器实现目标接扣;将被适配者组合给适配器.  * 缺点: 必须实现目标接口所有方法。可是万一我只需要适配一个接口呢,那其他的接口也得强制实现     * 本来想 让其他不想实现的接口库置为private,这样外部就调不到了.但继承/实现 不能减少被继承者的范围,也就不能置为私有的。 *  */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.walk();    }    /*        Cannot reduce the visibility of the inherited method from Duck    @Override    private void fly(){        turkey.walk();    }    */}

枚举类适配成迭代器

但是这个使用场景是什么???
public class EnumerationIterator implements Iterator {    private Enumeration e ;    @Override    public boolean hasNext() {        return e.hasMoreElements();    }    @Override    public Object next() {        return e.nextElement();    }    @Override    public void remove() {        //因为被适配者Enumeration 没有remove()方法        throw new UnsupportedOperationException();    }}

模式框架

这里写图片描述

外观模式

定义

定义一个统一的接口,用来访问子系统中的一群接口。外观接口定义了一个高层接口,让系统更容易访问,而且可以让客户从系统的组件中解耦。

最少知识原则

只和你的密友谈话。即,希望在我们的设计中,不要让太多的类耦合在一起,免得修改系统的一部分,会影响很多部分。增加维护成本。

例如:

public float getTempt(){    Thermometer t = station.getThermometer();    return t.getTrmperature();}public float getTempt(){    return station.getTrmperature();//需要在station类中增添该方法}

利用该规则设计好处是 解耦,缺点是更多的“包装”类、风阀被制造出来,增加开发复杂度和时间。

装饰者与适配器的比较

装饰者是将一些新的行为加入进来适配器是将原有的接口转化成赢一个接口,并增加或者减少自己的功能。

适配器与外观的比较

外观和适配器都可以包装很多类,但外观的意图是简化接口,方便客户访问子系统;而适配器的意图是将接口转换成其他接口。
原创粉丝点击