zoukankan      html  css  js  c++  java
  • 适配器模式——HeadFirst设计模式学习笔记

    适配器模式:将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不相融的类可以相互合作

    设计:

    • 实现想要转换的接口
    • 取得要适配的对象的引用,作为局部变量
    • 用要适配的对象的方法实现接口中的方法

    客户使用适配器的过程:

    • 通过目标接口调用适配器方法
    • 适配器使用被适配者的接口转换成对被适配者的调用
    • 客户端接受调用结果,但并未察觉适配器在中转的作用

    特点:

    • 将类的接口转换成想要的接口,以便实现不同的接口,符合用户的期望
    • 适配器实现了目标接口,并持有被适配者的实例
    • 客户与适配器是解耦的
    • 可以通过实现双边的接口设计双向的适配器
    • 使用对象的组合,被适配者的子类也可以搭配适配器使用

    对象适配器vs类适配器:

    • 对象适配器采用组合形式;类适配器采用继承形式

    装饰者vs适配器:

    • 装饰者目的是添加新的行为责任,适配器目的是转换接口
    • 对客户端均透明

    举例:

    使用新的火鸡代替鸭子,客户希望想操作鸭子一样操作火鸡

    火鸡接口与鸭子接口:

    1 public interface Turkey {
    2     public void gobble();
    3     public void fly();
    4 }
    5 
    6 public interface Duck {
    7     public void quack();
    8     public void fly();
    9 }

    创建适配器:

     1 public class TurkeyAdapter implements Duck {
     2     Turkey turkey;
     3     TurkeyAdapter(Turkey turkey){
     4         this.turkey = turkey;
     5     }
     6     public void fly() {
     7         for(int i=0;i<5;i++){
     8             turkey.fly();
     9         }
    10     }
    11     public void quack() {
    12         turkey.gobble();
    13     }
    14 }

    客户端通过适配器像操作鸭子一样操作火鸡,而无需知道我们是通过适配器操作,更无需知道我们操作的是哪种鸭子或火鸡,因为我们是面向接口而不是实现编程

    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 }
  • 相关阅读:
    C++Primer 中间Sales_items.h头文件
    2014最不受欢迎10编程语言种
    解决ubuntu 14.04删ibus导致系统设置项目的损失后,,退出关机问题是不正常的
    会计翻译成英文
    Delphi 使用 Format格式话字符串的用法
    浅谈暂估应付账款的会计处理
    Delphi TcxTreelist 设置scrollbars 不起作用的原因
    Delphi 调试 通过BreakPoint
    折现率”的公式
    考会计证 需要的科目
  • 原文地址:https://www.cnblogs.com/HectorHou/p/5998714.html
Copyright © 2011-2022 走看看