zoukankan      html  css  js  c++  java
  • 《Head First 设计模式》之适配器模式与外观模式

    适配器模式(Adapter)

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

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

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

     鸭子—火鸡转换器

     1 // 鸭子
     2 public interface Duck {
     3     public void quack();
     4     public void fly();
     5 }
     6 
     7 // 绿头鸭是鸭子的子类,实现了鸭子的呱呱叫和飞行的能力
     8 public class MallardDuck implements Duck{
     9     @Override
    10     public void quack() {
    11         System.out.println("Quack");
    12     }
    13 
    14     @Override
    15     public void fly() {
    16         System.out.println("I'm flying");
    17     }
    18 }
    19 
    20 // 火鸡
    21 public interface Turkey {
    22     // 火鸡不会呱呱叫,只会咯咯叫
    23     public void gobble();
    24 
    25     public void fly();
    26 }
    27 
    28 // 野生火鸡
    29 public class WildTurkey implements Turkey{
    30     @Override
    31     public void gobble() {
    32         System.out.println("Gobble gobble");
    33     }
    34 
    35     @Override
    36     public void fly() {
    37         System.out.println("I'm flying a short distance");
    38     }
    39 }
    40 
    41 // 首先,你需要实现想转换成的类型接口,也就是你的客户期望看到的接口
    42 public class TurkeyAdapter implements Duck {
    43     Turkey turkey;
    44 
    45     // 接着,需要取得要适配的对象引用,这里我们引用构造器取得这个引用
    46     public TurkeyAdapter(Turkey turkey) {
    47         this.turkey = turkey;
    48     }
    49 
    50     // 现在我们需要实现接口中所有的方法。quack()在类之间的转换很简单,
    51     // 只要调用gobble()接可以了
    52     @Override
    53     public void quack() {
    54         turkey.gobble();
    55     }
    56 
    57     // 固然两个接口都具备了fly()方法,火鸡的飞行距离很短,不像鸭子可以长途飞行。
    58     // 要让鸭子的飞行和火鸡的飞行能够对应,必须连续五次调用火鸡的fly()来完成
    59     @Override
    60     public void fly() {
    61         for (int i = 0; i < 5; i++) {
    62             turkey.fly();
    63         }
    64     }
    65 }

    Client:

    1 public class DuckTestDrive {
    2     public static void main(String[] args) {
    3         MallardDuck Duck = new MallardDuck();
    4         WildTurkey turkey = new WildTurkey();
    5         Duck turkeyAdapter =  new TurkeyAdapter(turkey); // generate a turkey-like duck
    6         turkeyAdapter.fly();
    7         turkeyAdapter.quack();  
    8     }
    9 }

    枚举器—迭代器适配器

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

     1 public class EnumerationIterator implements Iterator {
     2     Enumeration enum;
     3     public EnumerationIterator(Enumeration enum){
     4         this.enum = enum;
     5     }
     6     public boolean hasNext(){
     7         return enum.hasMoreElements();
     8     }
     9     public Object next(){
    10         return enum.nextElement();
    11     }
    12     public void remove(){
    13         throw new UnsupportedOperationException();//不能支持迭代器remove方法,因为枚举器没有该方法,抛出异常
    14     }
    15 }

     


     

    外观模式

  • 相关阅读:
    右击DataGrilView行事件
    winForm textBox的数字输入验证
    C#获取本月开始日期和结束日期
    异步加载js文件并执行js方法:实现异步处理网页的复杂效果
    Windows Phone 7 IEnumerable<T>.Select和SelectMany的区别
    Windows Phone 7 Perst嵌入式数据库的学习
    Windows Phone 7 Coding4Fun的弹出框
    MVVM模式介绍
    Windows Phone 7 网络编程之天气预报应用
    Windows Phone 7 扩展TextBox控件为数字输入文本框
  • 原文地址:https://www.cnblogs.com/-1307/p/6440335.html
Copyright © 2011-2022 走看看