美文网首页
适配器模式和外观模式

适配器模式和外观模式

作者: 狐尼克朱迪 | 来源:发表于2016-10-22 14:16 被阅读0次

    适配器模式

    定义

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

    使用场景

    • 想使用一个现有的类,它的接口不匹配你需要的
    • 想要创建一个可重用的类,它与不相关或不可预见的类协作,即不一定具有兼容接口的类
    • 需要使用几个现有的子类,但通过子类化每个子类来调整其接口是不切实际的。 对象适配器可以适应其父类的接口。

    例子

    船长可以指挥战舰(BatteShip)去战斗,但是现在有条渔船也想加入战斗,需要对其接口进行适配。
    战舰需要实现fire和move接口:

    public interface BattleShip {
      void fire();
      void move();
    }
    

    渔船没有fire和move接口,只有航行sail和捕鱼fish接口:

    public class FishingBoat {
      public void sail() {
        System.out.println("The Boat is moving to that place");
      }
      public void fish() {
        System.out.println("fishing ...");
      }
    }
    

    对FishingBoat进行适配,实现BatteShip的接口:

    public class BattleFishingBoat implements BattleShip {
      private FishingBoat boat;
    
      public BattleFishingBoat() {
        boat = new FishingBoat();
      }
    
      public void fire() {
        System.out.println("fire!");
      }
    
      public void move() {
        boat.sail();
      }
    }
    

    船长可以发号实施move和fire行为,它需要一个BattleShip作为目标:

    public class Captain implements BattleShip {
      private BattleShip battleship;
    
      public Captain() {}
    
      public Captain(BattleShip battleship) {
        this.battleship = battleship;
      }
    
      public void setBattleship(BattleShip battleship) {
        this.battleship = battleship;
      }
    
      public void fire() {
        battleship.fire();
      }
    
      public void move() {
        battleship.move();
      }
    }
    

    现在船长可以对渔船发号命令,进行move、fire操作:

    public class App {
      public static void main(String[] args) {
        Captain captain = new Captain(new BattleFishingBoat());
        captain.move();
        captain.fire();
      }
    }
    

    分析

    适配器模式,可以说是将一个接口转成另一个接口;而装饰者模式不修改接口,但加入责任。

    外观模式

    定义

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

    例子

    一个简单例子:

    public float getTemp(){
        return station.getThermometer().getTemperature();
    }
    

    上面的例子中,我们先从气象站(station)取得温度计(thermometer),然后通过温度计获得温度;这样相当于程序依赖两个对象:气象站和温度计。
    入股在气象站中加紧一个方法,用来向温度计请求温度,那么和我们的相关的对象就只有气象站一个了:

    public float getTemp(){
        return station.getTemperature();
    }
    

    分析

    外观模式复合设计模式中的最少知识原则只和你的密友谈话。这个原则的意思是不要让太多的类耦合在一起,免得修改系统中一部分会影响到其他部分。

    参考

    iluwatar/java-design-patterns

    相关文章

      网友评论

          本文标题:适配器模式和外观模式

          本文链接:https://www.haomeiwen.com/subject/wothuttx.html