设计模式---适配器模式和外观模式

时间:2022-03-19 00:18:26


适配器模式(Adapter)

  • 适配器(adapter-pattern):将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。两种形式:
  1. 对象适配器(组合)
  2. 类适配器(多重继承):在Java中不能实现
  • 外观(facade-pattern):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
  • 原则

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

  • 要点:
  1. 当需要使用一个现有的类而其接口不符合需要时,使用适配器。适配器改变接口以符合客户期望。
  2. 当需要简化并统一一个很大的接口或一群复杂的接口时,使用外观。外观将客户从一个复杂的子系统中解耦。
  3. 适配器与装饰者的区别:适配器将一个对象包装起来以改变接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化接口

鸭子—火鸡转换器

// 鸭子
public interface Duck {
    public void quack();
    public void fly();
}

// 绿头鸭是鸭子的子类,实现了鸭子的呱呱叫和飞行的能力
public class MallardDuck implements Duck{
    @Override
    public void quack() {
        System.out.println("Quack");
    }

    @Override
    public void fly() {
        System.out.println("I'm flying");
    }
}

// 火鸡
public interface Turkey {
    // 火鸡不会呱呱叫,只会咯咯叫
    public void gobble();

    public void fly();
}

// 野生火鸡
public class WildTurkey implements Turkey{
    @Override
    public void gobble() {
        System.out.println("Gobble gobble");
    }

    @Override
    public void fly() {
        System.out.println("I'm flying a short distance");
    }
}

// 首先,你需要实现想转换成的类型接口,也就是你的客户期望看到的接口
public class TurkeyAdapter implements Duck {
    Turkey turkey;

    // 接着,需要取得要适配的对象引用,这里我们引用构造器取得这个引用
    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    // 现在我们需要实现接口中所有的方法。quack()在类之间的转换很简单,
    // 只要调用gobble()接可以了
    @Override
    public void quack() {
        turkey.gobble();
    }

    // 固然两个接口都具备了fly()方法,火鸡的飞行距离很短,不像鸭子可以长途飞行。
    // 要让鸭子的飞行和火鸡的飞行能够对应,必须连续五次调用火鸡的fly()来完成
    @Override
    public void fly() {
        for (int i = 0; i < 5; i++) {
            turkey.fly();
        }
    }
}
public class DuckTestDrive {
    public static void main(String[] args) {
        MallardDuck Duck = new MallardDuck();
        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter =  new TurkeyAdapter(turkey); // generate a turkey-like duck
        turkeyAdapter.fly();
        turkeyAdapter.quack();  
    }
}

枚举器—迭代器适配器

  旧的枚举器(Enumeration),新的迭代器(Iterator)



public class EnumerationIterator implements Iterator {
    Enumeration enum;
    public EnumerationIterator(Enumeration enum){
        this.enum = enum;
    }
    public boolean hasNext(){
        return enum.hasMoreElements();
    }
    public Object next(){
        return enum.nextElement();
    }
    public void remove(){
        throw new UnsupportedOperationException();//不能支持迭代器remove方法,因为枚举器没有该方法,抛出异常
    }
}

外观模式