适配器模式(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方法,因为枚举器没有该方法,抛出异常
}
}

外观模式

最新文章

  1. 在线浏览PDF之PDF.JS (附demo)
  2. .NET LINQ查询语法与方法语法
  3. mysql 查询数据库表结构
  4. phpstorm 9 keygen
  5. 内容生成器:content、计数器、多列
  6. java内存空间详解
  7. 推荐一个Android开发懒人库 -- ButterKnife
  8. Libevent 定时器
  9. Android学习整理之Activity生命周期篇
  10. hdu1305 字典树
  11. spark 分析sql内容再插入到sql表中
  12. 关于Spring的Controller及Struts的Action的多线程的注意
  13. maven上传自定义jar到本地仓库
  14. unity 之2D游戏简单操作
  15. frame,iframe,frameset用法和区别
  16. Android4: Write Storage权限问题
  17. Unity3d ShaderLab之WorldNormalVector
  18. 一脸懵逼学习基于CentOs的Hadoop集群安装与配置
  19. Python中的条件和循环语句
  20. mongodb导入导出数据

热门文章

  1. leetcode-002
  2. PCLVisualizer可视化类(5)
  3. crontab简易入门
  4. 22. Bypass X-WAF SQL注入防御(多姿势)
  5. 一个使用MVC3+NHibernate “增删改查” 的项目(修正版)
  6. Android APK反编译技巧全讲解
  7. Python包管理工具setuptools之setup函数参数详解
  8. ERROR 1010 (HY000): Error dropping database (can&#39;t rmdir &#39;./nsd&#39;, errno: 39)
  9. bzoj4435: [Cerc2015]Juice Junctions(最小割树+hash)
  10. 洛谷P3396 哈希冲突(分块)