《Head First 设计模式》之适配器模式与外观模式
适配器模式(Adapter)
- 适配器(adapter-pattern):将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。两种形式:
- 对象适配器(组合)
- 类适配器(多重继承):在Java中不能实现
- 外观(facade-pattern):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
- 原则
最少知识原则:只和你的密友谈话
- 要点:
- 当需要使用一个现有的类而其接口不符合需要时,使用适配器。适配器改变接口以符合客户期望。
- 当需要简化并统一一个很大的接口或一群复杂的接口时,使用外观。外观将客户从一个复杂的子系统中解耦。
- 适配器与装饰者的区别:适配器将一个对象包装起来以改变接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化接口。
鸭子—火鸡转换器
// 鸭子
public interface Duck {
public void quack();
public void fly();
} // 绿头鸭是鸭子的子类,实现了鸭子的呱呱叫和飞行的能力
public class MallardDuck implements Duck{
@Override
public void quack() {
System.out.println("Quack");
} @Override
public void fly() {
System.out.println("I'm flying");
}
} // 火鸡
public interface Turkey {
// 火鸡不会呱呱叫,只会咯咯叫
public void gobble(); public void fly();
} // 野生火鸡
public class WildTurkey implements Turkey{
@Override
public void gobble() {
System.out.println("Gobble gobble");
} @Override
public void fly() {
System.out.println("I'm flying a short distance");
}
} // 首先,你需要实现想转换成的类型接口,也就是你的客户期望看到的接口
public class TurkeyAdapter implements Duck {
Turkey turkey; // 接着,需要取得要适配的对象引用,这里我们引用构造器取得这个引用
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
} // 现在我们需要实现接口中所有的方法。quack()在类之间的转换很简单,
// 只要调用gobble()接可以了
@Override
public void quack() {
turkey.gobble();
} // 固然两个接口都具备了fly()方法,火鸡的飞行距离很短,不像鸭子可以长途飞行。
// 要让鸭子的飞行和火鸡的飞行能够对应,必须连续五次调用火鸡的fly()来完成
@Override
public void fly() {
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
Client:
 public class DuckTestDrive {
     public static void main(String[] args) {
         MallardDuck Duck = new MallardDuck();
         WildTurkey turkey = new WildTurkey();
         Duck turkeyAdapter =  new TurkeyAdapter(turkey); // generate a turkey-like duck
         turkeyAdapter.fly();
         turkeyAdapter.quack();
     }
 }
枚举器—迭代器适配器
旧的枚举器(Enumeration),新的迭代器(Iterator)

 public class EnumerationIterator implements Iterator {
     Enumeration enum;
     public EnumerationIterator(Enumeration enum){
         this.enum = enum;
     }
     public boolean hasNext(){
         return enum.hasMoreElements();
     }
     public Object next(){
         return enum.nextElement();
     }
     public void remove(){
         throw new UnsupportedOperationException();//不能支持迭代器remove方法,因为枚举器没有该方法,抛出异常
     }
 }
外观模式

《Head First 设计模式》之适配器模式与外观模式的更多相关文章
- Head First 设计模式之适配器模式与外观模式
		Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ... 
- 适配器模式和外观模式(head first设计模式——6)
		为什么要把适配器模式和外观模式放在同一篇文章中,主要是其相对前面的几个模式来讲会简单些并且具有相似之处.下面就分别通过例子来看理解一下两种模式,然后再进行对其进行比较. 一.适配器模式 1.1适配器模 ... 
- 设计模式(九)外观模式Facade(结构型)
		设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ... 
- Java设计模式(11)外观模式(Facade模式)
		外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ... 
- 设计模式(二)-- 外观模式(Facade)
		设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ... 
- headfirst设计模式(8)—适配器模式与外观模式
		前言 这一章主要讲2个模式,一个是,适配器模式(负责将一个类的接口适配成用户所期待的),另外一个是外观模式(为子系统提供一个共同的对外接口),看完的第一反应是,为什么要把它们两放在同一章,难道它们有什 ... 
- 【HeadFirst设计模式】7.适配器模式与外观模式
		今晚学习完第七章,顺便做一下知识备忘. 适配器模模式: 定义:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 对象适配器: 类适配器: 外观模式: 提供了一个统一 ... 
- 设计模式(十一)外观模式(Facade Pattern)
		一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ... 
- 【转】设计模式(九)外观模式Facade(结构型)
		设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ... 
随机推荐
- 《精通Spring4.X企业应用开发实战》读后感第七章(AOP基础知识、jdk动态代理,CGLib动态代理)
- ubuntu下sourceinsight的安装
			转载自blog.csdn.net/zzobin/article/details/7376616 1. 安装wine 详看:http://wiki.ubuntu.org.cn/Wine sudo apt ... 
- Entity Framework Code-First(4):Simple Code First Example
			Simple Code First Example: Let's assume that we want to create a simple application for XYZ School. ... 
- javascript函数自执行里的this为什么指向window
			当你要确定“函数中的this是什么”的时候,永远不要到函数定义的地方去找答案!而是要到函数被调用的地方找答案! 具体说:函数里面的this的含义,是由它被调用的方式决定的. 换句话说,当你看到下面的代 ... 
- ant安装和配置
			一.安装ant到官方主页http://ant.apache.org下载新版(我用的1.9.2)的ant,得到的是一个apache-ant-1.9.2-bin.zip的压缩包.将其解压到你的硬盘上,例如 ... 
- C# 写 LeetCode easy #28 Implement strStr()
			28.Implement strStr() Implement strStr(). Return the index of the first occurrence of needle in hays ... 
- Note: ENDBOX: Scalable Middlebox Functions Using Client-Side Trusted Execution
			ENDBOX enable secure networking by client-Side trusted execution. What ENDBOX is a scalable middlebo ... 
- Element-ui Cascader 级联选择器 同时返回 value 和 label
			给 cascader 组件赋值一个别名 ref="cascaderAddr" <el-form-item label="部门" prop="or ... 
- CodeForces 106C 【DP】
			题意: n g dough m种商品? 每种有ai stuffing, 拿bi stuffing + ci dough -> di tugriks rest c0 dough -> d0 ... 
- JavaWeb:Cookie处理和Session跟踪
			JavaWeb:Cookie处理和Session跟踪 Cookie处理 什么是Cookie Cookie 是存储在客户端计算机上的文本文件,保留了各种跟踪信息.因为HTTP协议是无状态的,即服务器不知 ... 
