适配器模式(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. }

外观模式

《Head First 设计模式》之适配器模式与外观模式的更多相关文章

  1. Head First 设计模式之适配器模式与外观模式

    Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...

  2. 适配器模式和外观模式(head first设计模式——6)

    为什么要把适配器模式和外观模式放在同一篇文章中,主要是其相对前面的几个模式来讲会简单些并且具有相似之处.下面就分别通过例子来看理解一下两种模式,然后再进行对其进行比较. 一.适配器模式 1.1适配器模 ...

  3. 设计模式(九)外观模式Facade(结构型)

    设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

  4. Java设计模式(11)外观模式(Facade模式)

    外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...

  5. 设计模式(二)-- 外观模式(Facade)

    设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...

  6. headfirst设计模式(8)—适配器模式与外观模式

    前言 这一章主要讲2个模式,一个是,适配器模式(负责将一个类的接口适配成用户所期待的),另外一个是外观模式(为子系统提供一个共同的对外接口),看完的第一反应是,为什么要把它们两放在同一章,难道它们有什 ...

  7. 【HeadFirst设计模式】7.适配器模式与外观模式

    今晚学习完第七章,顺便做一下知识备忘. 适配器模模式: 定义:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 对象适配器: 类适配器: 外观模式: 提供了一个统一 ...

  8. 设计模式(十一)外观模式(Facade Pattern)

    一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...

  9. 【转】设计模式(九)外观模式Facade(结构型)

    设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

随机推荐

  1. svn merge和branch 详解

    1.本地Repository的创建 repository的创建很简单,假设我要在D:\TortoiseSVN\TestRepository目录中创建repository,只需右键TestReposit ...

  2. 树莓派 Learning 002 装机后必要的操作 --- 08 实现PC端 远程登入 树莓派 --- 法2 远程登录树莓派的图形桌面

    树莓派 装机后必要的操作 - 实现PC端 远程登入 树莓派 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 PC端系统:win10 x64 ...

  3. Hadoop Reducer个数设置

    在默认情况下,一个MapReduce Job如果不设置Reducer的个数,那么Reducer的个数为1.具体,可以通过JobConf.setNumReduceTasks(int numOfReduc ...

  4. NIPT需要多大的数据量(reads number)?

    NIPT需要多大的数据量(reads number)? 调研 2014 Noninvasive prenatal diagnosis of common aneuploidies by semicon ...

  5. 第5季-小试牛刀-项目开发\阶段2-新手上路\项目-移动物体监控系统\Sprint0-产品设计与规划

    lesson1---产品功能展示 先完成准备阶段,准备阶段要做的事情: a.项目经理选择团队, b.根据项目用户需求以及同类型的实物,制定产品功能列表 c.根据功能的难易程度,制定迭代周期以及在每周期 ...

  6. Gulp的学习和使用

    Gulp是一种直观.自动化构建的工具. Gulp是基于Node和NPM,安装教程点这里. 什么是Gulp? Gulp使用了node.js的流控制系统,使其(Gulp)构建更快,因为它不需要将临时文件/ ...

  7. 22. Bypass X-WAF SQL注入防御(多姿势)

    0x00 前言 X-WAF是一款适用中.小企业的云WAF系统,让中.小企业也可以非常方便地拥有自己的免费云WAF. 本文从代码出发,一步步理解WAF的工作原理,多姿势进行WAF Bypass. 0x0 ...

  8. 功防技术与实践第1.2章,kali初步了解

    20169314 2016-2017-2 <网络攻防实践>/<网络攻击与防范>第2周学习总结 一.教材学习内容总结 1.hacker和cracker的区别 网络攻防分三部分:系 ...

  9. SQL笔记:中级篇

    1.LIMIT 查询前多少条数据 例如:查询user表前三条数据 SELECT * FROM  user LIMIT 3 ORACLE:  SELECT name FROM user WHERE RO ...

  10. python接口自动化(三十六)-封装与调用--流程类接口关联续集(详解)

    简介 上一篇已经给大家都介绍过了流程类接口关联,但是由于博客的登录机制改变,所以没有办法给小伙伴们实战演练一下,那么这篇就按照上一篇计划的用jenkins来给小伙伴们演示一下流程类接口的封装和调用,其 ...