适配器模式(Adapter)

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

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

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

鸭子—火鸡转换器

 // 鸭子
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 设计模式》之适配器模式与外观模式的更多相关文章

  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. crontab简易入门

    前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比 ...

  2. Luogu 2900 [USACO08MAR]土地征用Land Acquisition

    斜率优化dp. 首先发现如果存在$x$和$y$使得$len(x) \geq len(y)$并且$wid(x) \geq wid(y)$,那么$y$直接不考虑就好了,因为在买$x$的时候就把$y$顺便带 ...

  3. windows配置换行符

    CR.LF.CR/LF为不同操作系统上使用的换行符: Windows/DOS系统:采用CR/LF表示下一行: Unix/Linux系统:采用LF表示下一行: Mac OS系统:采用CR表示下一行: M ...

  4. Android常见内存泄露,学会这六招优化APP性能

    很多开发者都知道,在面试的时候会经常被问到内存泄露和内存溢出的问题. 1.内存溢出(Out Of Memory,简称 OOM),通俗理解就是内存不够,即内存占用超出内存的空间大小. 2.内存泄漏(Me ...

  5. C#回调函数的简单讲解与应用例子

    using System; namespace CallBackTest{ class Program //用户层,执行输入等操作 { static void Main(string[] args) ...

  6. C# 字符串转JSON

    一.简单小结 C# 中 String 转 JSON var items = JsonConvert.DeserializeObject<class>(stringJSON); 这里的 cl ...

  7. PostgreSQL 务实应用(四/5)JSON

    JSON 可谓风靡互联网,在数据交换使用上,其优势特别明显,其结构简洁.可读易读.形式灵活.很多 API 接口的数据都采用 JSON 来表示. PostgreSQL 对 JSON 提供了良好的支持.具 ...

  8. How to modify rosbag?如何修改rosbag?

    Ubuntu16.04,kinetic 本文示例修改使用rosbag中的frame id 在http://wiki.ros.org/bag_tools中,能找到 change_camera_info. ...

  9. tcp/ip四次挥手

    四次分手: 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭.这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接.收到一个 FIN只意味着这一方向上没有数据流动,一个 ...

  10. PJzhang:英国通信总部GCHQ开源产品-网络瑞士军刀CyberChef

    猫宁!!! 参考链接:https://www.4hou.com/info/news/981.html 这个产品免费开源易用,如果称之为网络瑞士军刀,没什么异议. github地址:https://gi ...