天天看点

Java设计模式之适配器模式和外观模式

适配器模式

所谓适配器模式,将一个类的接口,转换为客户所期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

适配器主要组成包括:

目标接口:客户端所希望得到的接口

适配器:这个主要就是将被适配器转换为目标接口,一般要实现目标接口,且包含被配饰器成员

被适配器:也就是用来改造的,提供给适配器来转换的,通常要将该被适配器绑定传入到适配器中,让适配器得以转换。

一般这种模式就是在不修改现有代码的情况下,将一个接口转换为另一个接口。它主要包含两种方式:

对象适配器:

这种就是在适配器中利用了组合来处理,将被适配器作为适配器的一个成员属性,而且适配器则就实现或者继承客户所需要的目标接口

代码实例:

假如有一个小狗和小猫的两个接口,现在客户需要小猫,可是只有小狗接口,则就可以利用适配器来转换。

这里只写出适配器代码:

package test;

publicclass AnimalAdapter implements Cat{

private Dog dog;//被适配器

public AnimalAdapter(Dog dog)

{

this.dog=dog;

}

publicvoid mimi() {

dog.wow();

publicvoid run() {

dog.run();

publicvoid sleep() {

dog.sleep();

外观模式

所谓外观模式,就是提供一个统一接口,用来访问子系统中的一群接口。它定义了一个高层接口,让子系统更容易使用。

外观模式并没有封装了子系统的类,外观只是提供了更简化的接口,它里面仍然包含着子系统中各个接口的对象,并且利用组合将子系统的所有接口来包含起来。它不仅提供了一个简化接口,而且依然将系统完整的功能暴露出来。

假设你要回家,回家进入屋里有各种各样的操作,此时就可以将这一系列操作看着一个子系统。可以简化该所有操作。

import com.whut.command.Light;

publicclass Facede {

//等各种子系统的操作

private Light light;

private Door door;

private Window window;

publicvoid goHome()

light.on();

door.open();

window.open();

适配器模式将一个或者多个类接口变成客户所期望的接口,并不是转换一个接口。

外观模式也可以只针对一个拥有复杂接口的类提供简化的接口。

适配器模式设计的意图主要就是让现有接口改变成符合顾客所期望的接口

外观模式的意图就是将一个复杂的子系统的所有接口简化,以提供一个便利方便的接口来给客户

设计模式原则:

最少知识原则,减少对象之间的交互,只留下几个“密友”。

要想遵循这个原则一般我们应该只调用属于以下范围的方法:

1 该对象的本身

2 被当做方法的参数而传递进来的对象

3 此方法所创建或实例化的任何对象

4 对象的任何组件,即该对象内部的所有成员变量或者方法

不要调用当某对象是调用其他方法后返回的结果。

两个模式总结:

1)当需要使用一个现有的类但是其接口并不符合你的需要时,可以用适配器模式

2)当需要简化并且统一一个很大的接口或者一群复杂的接口时候

3)适配器改变接口以使其符合客户的期望

4)外观将客户从一个复杂的子系统中解耦

5)适配器将一个对象包装起来以改变其接口。

装饰者将一个对象包装起来用来增加新的行为和责任。外观将一群对象包装起来以简化其接口。

本文转自 zhao_xiao_long 51CTO博客,原文链接:http://blog.51cto.com/computerdragon/1165985