《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 }

外观模式

时间: 2024-11-03 21:54:31

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

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

Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计中将类的接口转化为想要的接口,以实现同的接口,此外还将讲述另一个模式,将对象包装起来以简化接口. 1.   适配器简介 1.1 面向对象的适配器 真实世界的适配器比如位于美式插头和欧式插座之间的交流电适配器.面向对象的适配器是什么呢? 面向对象的适配器是将一个接口转化成另一个接口,以符合客户的期望.

设计模式之适配器模式与外观模式

适配器模式将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 例子:火鸡变鸭子. 先定义一个鸭子接口. package cn.sp.test06; /** * 鸭子 * @author 2YSP * */ public interface Duck { //具备呱呱叫 和 飞行的能力 public void quack(); public void fly(); } package cn.sp.test06; /** * 绿头鸭是鸭子的子类 * @author

设计模式 之 适配器模式与外观模式

一.适配器模式: 适配器模式,简单的说就是“到什么山,唱什么歌 ”,即它解决的是不兼容.不匹配的问题.先来举个小例子:当我们要把一个三相插头插到一个二相插座中,我们应该怎么做呢?当然是去找一个三相转二相的适配器插座,在这个例子中,适配器插座的作用是为了改变插座的接口,满足三相插头的需要:同样的,在我们接下来要介绍的OO适配器模式中,适配器的作用是将一个接口转换成另一个接口,以满足客户的需要. 下面我们用代码来演示这个例子.我们先贴出PlugOfTwo和PlugOfThree两个接口,表示二相插座

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

设计模式之代理模式、适配器模式和外观模式

编写基于另一组类的包装器接口是一项常见的API设计任务,例如,你的工作可能是维护一个大型的遗留代码库,相比重构所有代码,你更愿意审计一个新的 ,更简洁的API,以隐藏所有的底层遗留代码:或者你可能已经编写了一个C++API,后来需要给特定客户提供C接口:或者你的API用到了一个第三方依赖库,你想让客户直接使用此库,但是又不想将此库直接暴露给客户. 创建包装器API的潜在副作用是影响性能,这主要因为额外增加的一级间接寻址以及存储包装层次状态带来的开销.但就上面提到的那些情而言,这么做可以创建质量更

设计模式 8 —— 适配器和外观模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式(迭代器) 设计模式 4 —— 迭代器和组合模式(组合) 设计模式 5 —— 工厂模式 设计模式 6 —— 单件模式 设计模式 7 —— 命令模式 设计模式 8 —— 适配器和外观模式 概述 第1部分 问题引入 第2部分 适配器模式定义 第3部分 对象和类的适配者 第4 部分 适配器模式与装饰者模式区别 第5 部分 外观模式 第1 部分 问题引入 OO适配器是什么,现实中到处都是.比

Java设计模式(五)外观模式 桥梁模式

(九)外观模式 外观模式为子系统提供一个接口,便于使用.解决了类与类之间关系的,外观模式将类之间的关系放在一个 Facade 类中,降低了类类之间的耦合度,该模式不涉及接口. class CPU { public void startup(){ System.out.println("cpu start"); } public void shutdown(){ System.out.println("cpu stop"); } } class Memory { pu

设计模式学习笔记之适配器模式、外观模式

适配器模式     将一个类的接口转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间. 通过创建适配器进行接口转换,让不兼容的接口变成兼容.这可以让客户从实现的接口解耦.如果在一段时间后,想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口 而每次跟着修改. 客户使用适配器的过程: 1.客户通过目标接口调用适配器的方法对适配器发出请求: 2.适配器使用被适配器接口把请求转换成被适配器的一个或多个调用接口: 3.客户端收到调用的结果,但并未察觉这一切是适配器在

[设计模式]适配器模式与外观模式

之前的装饰者模式,是将对象包装起来,赋予新的功能.适配器模式则是包装对象,使其接口看起来不像自己而是别的对象,就是将类的接口转换成想要的接口,以便实现不同的接口.而外观模式则是将对象包装起来以简化其接口. 适配器模式讲一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.这个模式也表现了一个设计原则,最少知识原则.